Published site at c5b0989d229203d1e7525dc8890938d128516bc6.
diff --git a/acid-semantics.html b/acid-semantics.html
index 5204b8e..ad76e09 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -467,7 +467,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 6caa2b2..1c1b175 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
Binary files differ
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/ChoreService.html b/apidocs/src-html/org/apache/hadoop/hbase/ChoreService.html
index 7dfa757..c6ccc03 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/ChoreService.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/ChoreService.html
@@ -411,33 +411,39 @@
 <span class="sourceLineNo">403</span>   * Prints a summary of important details about the chore. Used for debugging purposes<a name="line.403"></a>
 <span class="sourceLineNo">404</span>   */<a name="line.404"></a>
 <span class="sourceLineNo">405</span>  private void printChoreDetails(final String header, ScheduledChore chore) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    LinkedHashMap&lt;String, String&gt; output = new LinkedHashMap&lt;&gt;();<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    output.put(header, "");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    output.put("Chore name: ", chore.getName());<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    output.put("Chore period: ", Integer.toString(chore.getPeriod()));<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    output.put("Chore timeBetweenRuns: ", Long.toString(chore.getTimeBetweenRuns()));<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    for (Entry&lt;String, String&gt; entry : output.entrySet()) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      if (LOG.isTraceEnabled()) LOG.trace(entry.getKey() + entry.getValue());<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    }<a name="line.414"></a>
-<span class="sourceLineNo">415</span>  }<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * Prints a summary of important details about the service. Used for debugging purposes<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   */<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private void printChoreServiceDetails(final String header) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    LinkedHashMap&lt;String, String&gt; output = new LinkedHashMap&lt;&gt;();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    output.put(header, "");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    output.put("ChoreService corePoolSize: ", Integer.toString(getCorePoolSize()));<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    output.put("ChoreService scheduledChores: ", Integer.toString(getNumberOfScheduledChores()));<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    output.put("ChoreService missingStartTimeCount: ",<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      Integer.toString(getNumberOfChoresMissingStartTime()));<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>    for (Entry&lt;String, String&gt; entry : output.entrySet()) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      if (LOG.isTraceEnabled()) LOG.trace(entry.getKey() + entry.getValue());<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>}<a name="line.432"></a>
+<span class="sourceLineNo">406</span>    if (!LOG.isTraceEnabled()) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      return;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    LinkedHashMap&lt;String, String&gt; output = new LinkedHashMap&lt;&gt;();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    output.put(header, "");<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    output.put("Chore name: ", chore.getName());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    output.put("Chore period: ", Integer.toString(chore.getPeriod()));<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    output.put("Chore timeBetweenRuns: ", Long.toString(chore.getTimeBetweenRuns()));<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>    for (Entry&lt;String, String&gt; entry : output.entrySet()) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      LOG.trace(entry.getKey() + entry.getValue());<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>  /**<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * Prints a summary of important details about the service. Used for debugging purposes<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   */<a name="line.422"></a>
+<span class="sourceLineNo">423</span>  private void printChoreServiceDetails(final String header) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    if (!LOG.isTraceEnabled()) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      return;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    LinkedHashMap&lt;String, String&gt; output = new LinkedHashMap&lt;&gt;();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    output.put(header, "");<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    output.put("ChoreService corePoolSize: ", Integer.toString(getCorePoolSize()));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    output.put("ChoreService scheduledChores: ", Integer.toString(getNumberOfScheduledChores()));<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    output.put("ChoreService missingStartTimeCount: ",<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      Integer.toString(getNumberOfChoresMissingStartTime()));<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    for (Entry&lt;String, String&gt; entry : output.entrySet()) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      LOG.trace(entry.getKey() + entry.getValue());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
+<span class="sourceLineNo">438</span>}<a name="line.438"></a>
 
 
 
diff --git a/book.html b/book.html
index 4ee43e8..ddb78d0 100644
--- a/book.html
+++ b/book.html
@@ -46121,7 +46121,7 @@
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2021-04-12 20:11:16 UTC
+Last updated 2021-04-13 20:07:17 UTC
 </div>
 </div>
 <link rel="stylesheet" href="./coderay-asciidoctor.css">
diff --git a/bulk-loads.html b/bulk-loads.html
index c4d2200..3c13948 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -172,7 +172,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index f2d19e1..f45e9a7 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -169,7 +169,7 @@
 <td>4364</td>
 <td>0</td>
 <td>0</td>
-<td>9156</td></tr></table></div>
+<td>9151</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -214,3282 +214,3272 @@
 <td>0</td>
 <td>1</td></tr>
 <tr class="a">
-<td><a href="#org.apache.hadoop.hbase.ChoreService.java">org/apache/hadoop/hbase/ChoreService.java</a></td>
-<td>0</td>
-<td>0</td>
-<td>2</td></tr>
-<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ClientMetaTableAccessor.java">org/apache/hadoop/hbase/ClientMetaTableAccessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ClusterId.java">org/apache/hadoop/hbase/ClusterId.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ClusterManager.java">org/apache/hadoop/hbase/ClusterManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.CompoundConfiguration.java">org/apache/hadoop/hbase/CompoundConfiguration.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.CoprocClusterManager.java">org/apache/hadoop/hbase/CoprocClusterManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.Coprocessor.java">org/apache/hadoop/hbase/Coprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.DistributedHBaseCluster.java">org/apache/hadoop/hbase/DistributedHBaseCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ExtendedCell.java">org/apache/hadoop/hbase/ExtendedCell.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.HBaseCluster.java">org/apache/hadoop/hbase/HBaseCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.HBaseClusterManager.java">org/apache/hadoop/hbase/HBaseClusterManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.HBaseConfiguration.java">org/apache/hadoop/hbase/HBaseConfiguration.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.HBaseIOException.java">org/apache/hadoop/hbase/HBaseIOException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.HBaseTestingUtility.java">org/apache/hadoop/hbase/HBaseTestingUtility.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>146</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.HFilePerformanceEvaluation.java">org/apache/hadoop/hbase/HFilePerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.HRegionLocation.java">org/apache/hadoop/hbase/HRegionLocation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.HTestConst.java">org/apache/hadoop/hbase/HTestConst.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.HadoopShims.java">org/apache/hadoop/hbase/HadoopShims.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.HealthChecker.java">org/apache/hadoop/hbase/HealthChecker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.IntegrationTestBackupRestore.java">org/apache/hadoop/hbase/IntegrationTestBackupRestore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.IntegrationTestDDLMasterFailover.java">org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.IntegrationTestIngest.java">org/apache/hadoop/hbase/IntegrationTestIngest.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.IntegrationTestIngestWithACL.java">org/apache/hadoop/hbase/IntegrationTestIngestWithACL.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.IntegrationTestIngestWithEncryption.java">org/apache/hadoop/hbase/IntegrationTestIngestWithEncryption.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.IntegrationTestIngestWithMOB.java">org/apache/hadoop/hbase/IntegrationTestIngestWithMOB.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.IntegrationTestIngestWithVisibilityLabels.java">org/apache/hadoop/hbase/IntegrationTestIngestWithVisibilityLabels.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.IntegrationTestManyRegions.java">org/apache/hadoop/hbase/IntegrationTestManyRegions.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.IntegrationTestMetaReplicas.java">org/apache/hadoop/hbase/IntegrationTestMetaReplicas.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.IntegrationTestRegionReplicaPerf.java">org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.IntegrationTestingUtility.java">org/apache/hadoop/hbase/IntegrationTestingUtility.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.KeyValue.java">org/apache/hadoop/hbase/KeyValue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.KeyValueTestUtil.java">org/apache/hadoop/hbase/KeyValueTestUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.KeyValueUtil.java">org/apache/hadoop/hbase/KeyValueUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.LocalHBaseCluster.java">org/apache/hadoop/hbase/LocalHBaseCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.MetaMockingUtil.java">org/apache/hadoop/hbase/MetaMockingUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.MetaMutationAnnotation.java">org/apache/hadoop/hbase/MetaMutationAnnotation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.MiniHBaseCluster.java">org/apache/hadoop/hbase/MiniHBaseCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.MultithreadedTestUtil.java">org/apache/hadoop/hbase/MultithreadedTestUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.NamespaceDescriptor.java">org/apache/hadoop/hbase/NamespaceDescriptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.NotAllMetaRegionsOnlineException.java">org/apache/hadoop/hbase/NotAllMetaRegionsOnlineException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.PerformanceEvaluation.java">org/apache/hadoop/hbase/PerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.PerformanceEvaluationCommons.java">org/apache/hadoop/hbase/PerformanceEvaluationCommons.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.PrivateCellUtil.java">org/apache/hadoop/hbase/PrivateCellUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>56</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.QosTestHelper.java">org/apache/hadoop/hbase/QosTestHelper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.RegionLocations.java">org/apache/hadoop/hbase/RegionLocations.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.RegionStateListener.java">org/apache/hadoop/hbase/RegionStateListener.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ScanPerformanceEvaluation.java">org/apache/hadoop/hbase/ScanPerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.SplitLogCounters.java">org/apache/hadoop/hbase/SplitLogCounters.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.SplitLogTask.java">org/apache/hadoop/hbase/SplitLogTask.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.StripeCompactionsPerformanceEvaluation.java">org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.TableDescriptors.java">org/apache/hadoop/hbase/TableDescriptors.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.TableName.java">org/apache/hadoop/hbase/TableName.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.TagBuilder.java">org/apache/hadoop/hbase/TagBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.TagBuilderFactory.java">org/apache/hadoop/hbase/TagBuilderFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.TagType.java">org/apache/hadoop/hbase/TagType.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.TestClientClusterStatus.java">org/apache/hadoop/hbase/TestClientClusterStatus.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.TestFSTableDescriptorForceCreation.java">org/apache/hadoop/hbase/TestFSTableDescriptorForceCreation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.TestGlobalMemStoreSize.java">org/apache/hadoop/hbase/TestGlobalMemStoreSize.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.TestIOFencing.java">org/apache/hadoop/hbase/TestIOFencing.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.TestLocalHBaseCluster.java">org/apache/hadoop/hbase/TestLocalHBaseCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.TestMetaTableAccessor.java">org/apache/hadoop/hbase/TestMetaTableAccessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.TestMovedRegionCache.java">org/apache/hadoop/hbase/TestMovedRegionCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.TestMultiVersions.java">org/apache/hadoop/hbase/TestMultiVersions.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.TestNamespace.java">org/apache/hadoop/hbase/TestNamespace.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.TestNodeHealthCheckChore.java">org/apache/hadoop/hbase/TestNodeHealthCheckChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.TestPartialResultsFromClientSide.java">org/apache/hadoop/hbase/TestPartialResultsFromClientSide.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.TestRegionRebalancing.java">org/apache/hadoop/hbase/TestRegionRebalancing.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.TestSerialization.java">org/apache/hadoop/hbase/TestSerialization.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.TestStochasticBalancerJmxMetrics.java">org/apache/hadoop/hbase/TestStochasticBalancerJmxMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.TestTagBuilder.java">org/apache/hadoop/hbase/TestTagBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.TimestampTestBase.java">org/apache/hadoop/hbase/TimestampTestBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ZNodeClearer.java">org/apache/hadoop/hbase/ZNodeClearer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.backup.FailedArchiveException.java">org/apache/hadoop/hbase/backup/FailedArchiveException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.backup.HFileArchiver.java">org/apache/hadoop/hbase/backup/HFileArchiver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.backup.regionserver.LogRollBackupSubprocedurePool.java">org/apache/hadoop/hbase/backup/regionserver/LogRollBackupSubprocedurePool.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.ChaosAgent.java">org/apache/hadoop/hbase/chaos/ChaosAgent.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.ChaosConstants.java">org/apache/hadoop/hbase/chaos/ChaosConstants.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.ChaosService.java">org/apache/hadoop/hbase/chaos/ChaosService.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.ChaosUtils.java">org/apache/hadoop/hbase/chaos/ChaosUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.MasterKillingMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/MasterKillingMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.MobSlowDeterministicMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/MobSlowDeterministicMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.MonkeyConstants.java">org/apache/hadoop/hbase/chaos/factories/MonkeyConstants.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.MonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/MonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.NoKillMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/NoKillMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.ServerKillingMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/ServerKillingMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.SlowDeterministicMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/SlowDeterministicMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.StressAssignmentManagerMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/StressAssignmentManagerMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.monkies.PolicyBasedChaosMonkey.java">org/apache/hadoop/hbase/chaos/monkies/PolicyBasedChaosMonkey.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.policies.PeriodicPolicy.java">org/apache/hadoop/hbase/chaos/policies/PeriodicPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.policies.TwoConcurrentActionPolicy.java">org/apache/hadoop/hbase/chaos/policies/TwoConcurrentActionPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AbstractClientScanner.java">org/apache/hadoop/hbase/client/AbstractClientScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AbstractResponse.java">org/apache/hadoop/hbase/client/AbstractResponse.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.Action.java">org/apache/hadoop/hbase/client/Action.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Admin.java">org/apache/hadoop/hbase/client/Admin.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.Append.java">org/apache/hadoop/hbase/client/Append.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncAdmin.java">org/apache/hadoop/hbase/client/AsyncAdmin.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncBatchRpcRetryingCaller.java">org/apache/hadoop/hbase/client/AsyncBatchRpcRetryingCaller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncClientScanner.java">org/apache/hadoop/hbase/client/AsyncClientScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncScanSingleRegionRpcRetryingCaller.java">org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncTableImpl.java">org/apache/hadoop/hbase/client/AsyncTableImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.BatchScanResultCache.java">org/apache/hadoop/hbase/client/BatchScanResultCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.BufferingScanResultConsumer.java">org/apache/hadoop/hbase/client/BufferingScanResultConsumer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ClientIdGenerator.java">org/apache/hadoop/hbase/client/ClientIdGenerator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ClientUtil.java">org/apache/hadoop/hbase/client/ClientUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ClusterStatusListener.java">org/apache/hadoop/hbase/client/ClusterStatusListener.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ColumnCountOnRowFilter.java">org/apache/hadoop/hbase/client/ColumnCountOnRowFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ColumnFamilyDescriptor.java">org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder.java">org/apache/hadoop/hbase/client/ColumnFamilyDescriptorBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.CompactType.java">org/apache/hadoop/hbase/client/CompactType.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.CompleteScanResultCache.java">org/apache/hadoop/hbase/client/CompleteScanResultCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ConnectionFactory.java">org/apache/hadoop/hbase/client/ConnectionFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ConnectionUtils.java">org/apache/hadoop/hbase/client/ConnectionUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.Delete.java">org/apache/hadoop/hbase/client/Delete.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Get.java">org/apache/hadoop/hbase/client/Get.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.HConnectionTestingUtility.java">org/apache/hadoop/hbase/client/HConnectionTestingUtility.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.MetricsConnection.java">org/apache/hadoop/hbase/client/MetricsConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.MultiResponse.java">org/apache/hadoop/hbase/client/MultiResponse.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Mutation.java">org/apache/hadoop/hbase/client/Mutation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.Operation.java">org/apache/hadoop/hbase/client/Operation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.PackagePrivateFieldAccessor.java">org/apache/hadoop/hbase/client/PackagePrivateFieldAccessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.Put.java">org/apache/hadoop/hbase/client/Put.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Query.java">org/apache/hadoop/hbase/client/Query.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RawAsyncHBaseAdmin.java">org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RegionInfo.java">org/apache/hadoop/hbase/client/RegionInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RegionInfoBuilder.java">org/apache/hadoop/hbase/client/RegionInfoBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RegionInfoDisplay.java">org/apache/hadoop/hbase/client/RegionInfoDisplay.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RegionLocator.java">org/apache/hadoop/hbase/client/RegionLocator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RegionReplicaUtil.java">org/apache/hadoop/hbase/client/RegionReplicaUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RequestController.java">org/apache/hadoop/hbase/client/RequestController.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RequestControllerFactory.java">org/apache/hadoop/hbase/client/RequestControllerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.Result.java">org/apache/hadoop/hbase/client/Result.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ResultScanner.java">org/apache/hadoop/hbase/client/ResultScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RetriesExhaustedException.java">org/apache/hadoop/hbase/client/RetriesExhaustedException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException.java">org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RowAccess.java">org/apache/hadoop/hbase/client/RowAccess.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Scan.java">org/apache/hadoop/hbase/client/Scan.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.SimpleRequestController.java">org/apache/hadoop/hbase/client/SimpleRequestController.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.SimpleScanResultConsumer.java">org/apache/hadoop/hbase/client/SimpleScanResultConsumer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.SnapshotDescription.java">org/apache/hadoop/hbase/client/SnapshotDescription.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Table.java">org/apache/hadoop/hbase/client/Table.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TableDescriptor.java">org/apache/hadoop/hbase/client/TableDescriptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TableDescriptorBuilder.java">org/apache/hadoop/hbase/client/TableDescriptorBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TableState.java">org/apache/hadoop/hbase/client/TableState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAdmin.java">org/apache/hadoop/hbase/client/TestAdmin.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAdmin2.java">org/apache/hadoop/hbase/client/TestAdmin2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAdmin4.java">org/apache/hadoop/hbase/client/TestAdmin4.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAdminShell.java">org/apache/hadoop/hbase/client/TestAdminShell.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAdminShell2.java">org/apache/hadoop/hbase/client/TestAdminShell2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncClusterAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncClusterAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncNamespaceAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncNamespaceAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncQuotaAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncQuotaAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncRegionAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncRegionAdminApi2.java">org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncReplicationAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncReplicationAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncTableAdminApi2.java">org/apache/hadoop/hbase/client/TestAsyncTableAdminApi2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncTableAdminApi3.java">org/apache/hadoop/hbase/client/TestAsyncTableAdminApi3.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncTableGetMultiThreaded.java">org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncTableScanMetrics.java">org/apache/hadoop/hbase/client/TestAsyncTableScanMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncTableScanner.java">org/apache/hadoop/hbase/client/TestAsyncTableScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAvoidCellReferencesIntoShippedBlocks.java">org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestBlockEvictionFromClient.java">org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestCatalogReplicaLoadBalanceSimpleSelector.java">org/apache/hadoop/hbase/client/TestCatalogReplicaLoadBalanceSimpleSelector.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestCheckAndMutate.java">org/apache/hadoop/hbase/client/TestCheckAndMutate.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestColumnFamilyDescriptorBuilder.java">org/apache/hadoop/hbase/client/TestColumnFamilyDescriptorBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestEnableTable.java">org/apache/hadoop/hbase/client/TestEnableTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestFromClientSide3.java">org/apache/hadoop/hbase/client/TestFromClientSide3.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestFromClientSideNoCodec.java">org/apache/hadoop/hbase/client/TestFromClientSideNoCodec.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestFromClientSideScanExcpetion.java">org/apache/hadoop/hbase/client/TestFromClientSideScanExcpetion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestGetScanColumnsWithNewVersionBehavior.java">org/apache/hadoop/hbase/client/TestGetScanColumnsWithNewVersionBehavior.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestImmutableScan.java">org/apache/hadoop/hbase/client/TestImmutableScan.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestIncrementsFromClientSide.java">org/apache/hadoop/hbase/client/TestIncrementsFromClientSide.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestLimitedScanWithFilter.java">org/apache/hadoop/hbase/client/TestLimitedScanWithFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestMetaCache.java">org/apache/hadoop/hbase/client/TestMetaCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestMultiParallel.java">org/apache/hadoop/hbase/client/TestMultiParallel.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestMultipleTimestamps.java">org/apache/hadoop/hbase/client/TestMultipleTimestamps.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestPutDeleteEtcCellIteration.java">org/apache/hadoop/hbase/client/TestPutDeleteEtcCellIteration.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestPutWithDelete.java">org/apache/hadoop/hbase/client/TestPutWithDelete.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestQuotasShell.java">org/apache/hadoop/hbase/client/TestQuotasShell.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestRSGroupShell.java">org/apache/hadoop/hbase/client/TestRSGroupShell.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestRawAsyncTableLimitedScanWithFilter.java">org/apache/hadoop/hbase/client/TestRawAsyncTableLimitedScanWithFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestRawAsyncTableScan.java">org/apache/hadoop/hbase/client/TestRawAsyncTableScan.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestReplicaWithCluster.java">org/apache/hadoop/hbase/client/TestReplicaWithCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestReplicasClient.java">org/apache/hadoop/hbase/client/TestReplicasClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestResult.java">org/apache/hadoop/hbase/client/TestResult.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestScannerTimeout.java">org/apache/hadoop/hbase/client/TestScannerTimeout.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestScannersFromClientSide2.java">org/apache/hadoop/hbase/client/TestScannersFromClientSide2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestServerBusyException.java">org/apache/hadoop/hbase/client/TestServerBusyException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestShell.java">org/apache/hadoop/hbase/client/TestShell.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestSmallReversedScanner.java">org/apache/hadoop/hbase/client/TestSmallReversedScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestSnapshotCloneIndependence.java">org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestSnapshotDFSTemporaryDirectory.java">org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestSnapshotFromClient.java">org/apache/hadoop/hbase/client/TestSnapshotFromClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestSnapshotMetadata.java">org/apache/hadoop/hbase/client/TestSnapshotMetadata.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory.java">org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestTableShell.java">org/apache/hadoop/hbase/client/TestTableShell.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestTableSnapshotScanner.java">org/apache/hadoop/hbase/client/TestTableSnapshotScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestTimestampsFilter.java">org/apache/hadoop/hbase/client/TestTimestampsFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.VersionInfoUtil.java">org/apache/hadoop/hbase/client/VersionInfoUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.backoff.ClientBackoffPolicyFactory.java">org/apache/hadoop/hbase/client/backoff/ClientBackoffPolicyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.backoff.ServerStatistics.java">org/apache/hadoop/hbase/client/backoff/ServerStatistics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.coprocessor.Batch.java">org/apache/hadoop/hbase/client/coprocessor/Batch.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.coprocessor.DoubleColumnInterpreter.java">org/apache/hadoop/hbase/client/coprocessor/DoubleColumnInterpreter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.coprocessor.LongColumnInterpreter.java">org/apache/hadoop/hbase/client/coprocessor/LongColumnInterpreter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.coprocessor.package-info.java">org/apache/hadoop/hbase/client/coprocessor/package-info.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.example.AsyncClientExample.java">org/apache/hadoop/hbase/client/example/AsyncClientExample.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.locking.EntityLock.java">org/apache/hadoop/hbase/client/locking/EntityLock.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.locking.TestEntityLocks.java">org/apache/hadoop/hbase/client/locking/TestEntityLocks.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.metrics.ScanMetrics.java">org/apache/hadoop/hbase/client/metrics/ScanMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.metrics.ServerSideScanMetrics.java">org/apache/hadoop/hbase/client/metrics/ServerSideScanMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.codec.BaseDecoder.java">org/apache/hadoop/hbase/codec/BaseDecoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.codec.BaseEncoder.java">org/apache/hadoop/hbase/codec/BaseEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.codec.CellCodec.java">org/apache/hadoop/hbase/codec/CellCodec.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.codec.CellCodecWithTags.java">org/apache/hadoop/hbase/codec/CellCodecWithTags.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.codec.CodecPerformance.java">org/apache/hadoop/hbase/codec/CodecPerformance.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.codec.MessageCodec.java">org/apache/hadoop/hbase/codec/MessageCodec.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.codec.TestCellMessageCodec.java">org/apache/hadoop/hbase/codec/TestCellMessageCodec.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.constraint.BaseConstraint.java">org/apache/hadoop/hbase/constraint/BaseConstraint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.constraint.CheckConfigurationConstraint.java">org/apache/hadoop/hbase/constraint/CheckConfigurationConstraint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.constraint.Constraint.java">org/apache/hadoop/hbase/constraint/Constraint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.constraint.ConstraintException.java">org/apache/hadoop/hbase/constraint/ConstraintException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.constraint.package-info.java">org/apache/hadoop/hbase/constraint/package-info.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coordination.SplitLogManagerCoordination.java">org/apache/hadoop/hbase/coordination/SplitLogManagerCoordination.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coordination.ZKSplitLogManagerCoordination.java">org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coordination.ZkSplitLogWorkerCoordination.java">org/apache/hadoop/hbase/coordination/ZkSplitLogWorkerCoordination.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.BaseEnvironment.java">org/apache/hadoop/hbase/coprocessor/BaseEnvironment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.BulkLoadObserver.java">org/apache/hadoop/hbase/coprocessor/BulkLoadObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.ColumnInterpreter.java">org/apache/hadoop/hbase/coprocessor/ColumnInterpreter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.CoprocessorException.java">org/apache/hadoop/hbase/coprocessor/CoprocessorException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.CoprocessorHost.java">org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.CoreCoprocessor.java">org/apache/hadoop/hbase/coprocessor/CoreCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.HasMasterServices.java">org/apache/hadoop/hbase/coprocessor/HasMasterServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.HasRegionServerServices.java">org/apache/hadoop/hbase/coprocessor/HasRegionServerServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.MasterCoprocessor.java">org/apache/hadoop/hbase/coprocessor/MasterCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.MasterObserver.java">org/apache/hadoop/hbase/coprocessor/MasterObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.MetricsCoprocessor.java">org/apache/hadoop/hbase/coprocessor/MetricsCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.ObserverContext.java">org/apache/hadoop/hbase/coprocessor/ObserverContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.ObserverContextImpl.java">org/apache/hadoop/hbase/coprocessor/ObserverContextImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.RegionCoprocessor.java">org/apache/hadoop/hbase/coprocessor/RegionCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment.java">org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.RegionObserver.java">org/apache/hadoop/hbase/coprocessor/RegionObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor.java">org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.RegionServerObserver.java">org/apache/hadoop/hbase/coprocessor/RegionServerObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver.java">org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoprocessorInterface.java">org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoreMasterCoprocessor.java">org/apache/hadoop/hbase/coprocessor/TestCoreMasterCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoreRegionCoprocessor.java">org/apache/hadoop/hbase/coprocessor/TestCoreRegionCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoreRegionServerCoprocessor.java">org/apache/hadoop/hbase/coprocessor/TestCoreRegionServerCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestMasterCoprocessorExceptionWithAbort.java">org/apache/hadoop/hbase/coprocessor/TestMasterCoprocessorExceptionWithAbort.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestMasterCoprocessorExceptionWithRemove.java">org/apache/hadoop/hbase/coprocessor/TestMasterCoprocessorExceptionWithRemove.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestMasterObserver.java">org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestOpenTableInCoprocessor.java">org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestRegionObserverBypass.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestRegionObserverForAddingMutationsFromCoprocessors.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestRegionObserverInterface.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestRegionObserverScannerOpenHook.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.WALCoprocessor.java">org/apache/hadoop/hbase/coprocessor/WALCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment.java">org/apache/hadoop/hbase/coprocessor/WALCoprocessorEnvironment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.WALObserver.java">org/apache/hadoop/hbase/coprocessor/WALObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.package-info.java">org/apache/hadoop/hbase/coprocessor/package-info.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.errorhandling.ForeignException.java">org/apache/hadoop/hbase/errorhandling/ForeignException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher.java">org/apache/hadoop/hbase/errorhandling/ForeignExceptionDispatcher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.errorhandling.TestForeignExceptionDispatcher.java">org/apache/hadoop/hbase/errorhandling/TestForeignExceptionDispatcher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.errorhandling.TimeoutExceptionInjector.java">org/apache/hadoop/hbase/errorhandling/TimeoutExceptionInjector.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil.java">org/apache/hadoop/hbase/exceptions/ClientExceptionsUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.exceptions.FailedSanityCheckException.java">org/apache/hadoop/hbase/exceptions/FailedSanityCheckException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.exceptions.MergeRegionException.java">org/apache/hadoop/hbase/exceptions/MergeRegionException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.executor.EventHandler.java">org/apache/hadoop/hbase/executor/EventHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.executor.EventType.java">org/apache/hadoop/hbase/executor/EventType.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.executor.ExecutorService.java">org/apache/hadoop/hbase/executor/ExecutorService.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.executor.ExecutorType.java">org/apache/hadoop/hbase/executor/ExecutorType.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.favored.FavoredNodeAssignmentHelper.java">org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.favored.FavoredNodeLoadBalancer.java">org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.favored.FavoredNodesPromoter.java">org/apache/hadoop/hbase/favored/FavoredNodesPromoter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.favored.StartcodeAgnosticServerName.java">org/apache/hadoop/hbase/favored/StartcodeAgnosticServerName.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.favored.TestFavoredNodeAssignmentHelper.java">org/apache/hadoop/hbase/favored/TestFavoredNodeAssignmentHelper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.BigDecimalComparator.java">org/apache/hadoop/hbase/filter/BigDecimalComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.BinaryComparator.java">org/apache/hadoop/hbase/filter/BinaryComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.BinaryPrefixComparator.java">org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.BitComparator.java">org/apache/hadoop/hbase/filter/BitComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.ByteArrayComparable.java">org/apache/hadoop/hbase/filter/ByteArrayComparable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.ColumnCountGetFilter.java">org/apache/hadoop/hbase/filter/ColumnCountGetFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.ColumnPaginationFilter.java">org/apache/hadoop/hbase/filter/ColumnPaginationFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.ColumnPrefixFilter.java">org/apache/hadoop/hbase/filter/ColumnPrefixFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.ColumnRangeFilter.java">org/apache/hadoop/hbase/filter/ColumnRangeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.CompareFilter.java">org/apache/hadoop/hbase/filter/CompareFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.DependentColumnFilter.java">org/apache/hadoop/hbase/filter/DependentColumnFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.FamilyFilter.java">org/apache/hadoop/hbase/filter/FamilyFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.Filter.java">org/apache/hadoop/hbase/filter/Filter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterAllFilter.java">org/apache/hadoop/hbase/filter/FilterAllFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterBase.java">org/apache/hadoop/hbase/filter/FilterBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterList.java">org/apache/hadoop/hbase/filter/FilterList.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterListBase.java">org/apache/hadoop/hbase/filter/FilterListBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterListWithAND.java">org/apache/hadoop/hbase/filter/FilterListWithAND.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterListWithOR.java">org/apache/hadoop/hbase/filter/FilterListWithOR.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterTestingCluster.java">org/apache/hadoop/hbase/filter/FilterTestingCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterWrapper.java">org/apache/hadoop/hbase/filter/FilterWrapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter.java">org/apache/hadoop/hbase/filter/FirstKeyOnlyFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.FirstKeyValueMatchingQualifiersFilter.java">org/apache/hadoop/hbase/filter/FirstKeyValueMatchingQualifiersFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.FuzzyRowFilter.java">org/apache/hadoop/hbase/filter/FuzzyRowFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>19</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.InclusiveStopFilter.java">org/apache/hadoop/hbase/filter/InclusiveStopFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.KeyOnlyFilter.java">org/apache/hadoop/hbase/filter/KeyOnlyFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.LongComparator.java">org/apache/hadoop/hbase/filter/LongComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.MultiRowRangeFilter.java">org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.MultipleColumnPrefixFilter.java">org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.NullComparator.java">org/apache/hadoop/hbase/filter/NullComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.PageFilter.java">org/apache/hadoop/hbase/filter/PageFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.ParseConstants.java">org/apache/hadoop/hbase/filter/ParseConstants.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.ParseFilter.java">org/apache/hadoop/hbase/filter/ParseFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.PrefixFilter.java">org/apache/hadoop/hbase/filter/PrefixFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.QualifierFilter.java">org/apache/hadoop/hbase/filter/QualifierFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.RandomRowFilter.java">org/apache/hadoop/hbase/filter/RandomRowFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.RegexStringComparator.java">org/apache/hadoop/hbase/filter/RegexStringComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.RowFilter.java">org/apache/hadoop/hbase/filter/RowFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter.java">org/apache/hadoop/hbase/filter/SingleColumnValueExcludeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.SingleColumnValueFilter.java">org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.SkipFilter.java">org/apache/hadoop/hbase/filter/SkipFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.SubstringComparator.java">org/apache/hadoop/hbase/filter/SubstringComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestColumnPaginationFilter.java">org/apache/hadoop/hbase/filter/TestColumnPaginationFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestColumnPrefixFilter.java">org/apache/hadoop/hbase/filter/TestColumnPrefixFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestColumnRangeFilter.java">org/apache/hadoop/hbase/filter/TestColumnRangeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestDependentColumnFilter.java">org/apache/hadoop/hbase/filter/TestDependentColumnFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFilter.java">org/apache/hadoop/hbase/filter/TestFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>269</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFilterList.java">org/apache/hadoop/hbase/filter/TestFilterList.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>19</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFilterListOrOperatorWithBlkCnt.java">org/apache/hadoop/hbase/filter/TestFilterListOrOperatorWithBlkCnt.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFilterWithScanLimits.java">org/apache/hadoop/hbase/filter/TestFilterWithScanLimits.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFilterWrapper.java">org/apache/hadoop/hbase/filter/TestFilterWrapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFirstKeyValueMatchingQualifiersFilter.java">org/apache/hadoop/hbase/filter/TestFirstKeyValueMatchingQualifiersFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFuzzyRowAndColumnRangeFilter.java">org/apache/hadoop/hbase/filter/TestFuzzyRowAndColumnRangeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFuzzyRowFilterEndToEnd.java">org/apache/hadoop/hbase/filter/TestFuzzyRowFilterEndToEnd.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestInclusiveStopFilter.java">org/apache/hadoop/hbase/filter/TestInclusiveStopFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestMultiRowRangeFilter.java">org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestMultipleColumnPrefixFilter.java">org/apache/hadoop/hbase/filter/TestMultipleColumnPrefixFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestNullComparator.java">org/apache/hadoop/hbase/filter/TestNullComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestPageFilter.java">org/apache/hadoop/hbase/filter/TestPageFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestPrefixFilter.java">org/apache/hadoop/hbase/filter/TestPrefixFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestRandomRowFilter.java">org/apache/hadoop/hbase/filter/TestRandomRowFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestRegexComparator.java">org/apache/hadoop/hbase/filter/TestRegexComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestScanRowPrefix.java">org/apache/hadoop/hbase/filter/TestScanRowPrefix.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestSingleColumnValueExcludeFilter.java">org/apache/hadoop/hbase/filter/TestSingleColumnValueExcludeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestSingleColumnValueFilter.java">org/apache/hadoop/hbase/filter/TestSingleColumnValueFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TimestampsFilter.java">org/apache/hadoop/hbase/filter/TimestampsFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.ValueFilter.java">org/apache/hadoop/hbase/filter/ValueFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.WhileMatchFilter.java">org/apache/hadoop/hbase/filter/WhileMatchFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.fs.HFileSystem.java">org/apache/hadoop/hbase/fs/HFileSystem.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.fs.TestBlockReorderBlockLocation.java">org/apache/hadoop/hbase/fs/TestBlockReorderBlockLocation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.fs.TestBlockReorderMultiBlocks.java">org/apache/hadoop/hbase/fs/TestBlockReorderMultiBlocks.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.http.HttpServer.java">org/apache/hadoop/hbase/http/HttpServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.http.HttpServerFunctionalTest.java">org/apache/hadoop/hbase/http/HttpServerFunctionalTest.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.http.ProxyUserAuthenticationFilter.java">org/apache/hadoop/hbase/http/ProxyUserAuthenticationFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.http.TestHttpCookieFlag.java">org/apache/hadoop/hbase/http/TestHttpCookieFlag.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.http.TestProxyUserSpnegoHttpServer.java">org/apache/hadoop/hbase/http/TestProxyUserSpnegoHttpServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.ByteBuffInputStream.java">org/apache/hadoop/hbase/io/ByteBuffInputStream.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.ByteBufferOutputStream.java">org/apache/hadoop/hbase/io/ByteBufferOutputStream.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.CellOutputStream.java">org/apache/hadoop/hbase/io/CellOutputStream.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.FSDataInputStreamWrapper.java">org/apache/hadoop/hbase/io/FSDataInputStreamWrapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.FileLink.java">org/apache/hadoop/hbase/io/FileLink.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.HalfStoreFileReader.java">org/apache/hadoop/hbase/io/HalfStoreFileReader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.HeapSize.java">org/apache/hadoop/hbase/io/HeapSize.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.ImmutableBytesWritable.java">org/apache/hadoop/hbase/io/ImmutableBytesWritable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.Reference.java">org/apache/hadoop/hbase/io/Reference.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.TagCompressionContext.java">org/apache/hadoop/hbase/io/TagCompressionContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.TestByteBufferOutputStream.java">org/apache/hadoop/hbase/io/TestByteBufferOutputStream.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.TestFileLink.java">org/apache/hadoop/hbase/io/TestFileLink.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.TestHFileLink.java">org/apache/hadoop/hbase/io/TestHFileLink.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.TestHalfStoreFileReader.java">org/apache/hadoop/hbase/io/TestHalfStoreFileReader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.TestHeapSize.java">org/apache/hadoop/hbase/io/TestHeapSize.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.TestImmutableBytesWritable.java">org/apache/hadoop/hbase/io/TestImmutableBytesWritable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.TestMetricsIO.java">org/apache/hadoop/hbase/io/TestMetricsIO.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.TimeRange.java">org/apache/hadoop/hbase/io/TimeRange.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.WALLink.java">org/apache/hadoop/hbase/io/WALLink.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.asyncfs.AsyncFSOutput.java">org/apache/hadoop/hbase/io/asyncfs/AsyncFSOutput.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper.java">org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputSaslHelper.java">org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.asyncfs.ProtobufDecoder.java">org/apache/hadoop/hbase/io/asyncfs/ProtobufDecoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.compress.Compression.java">org/apache/hadoop/hbase/io/compress/Compression.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.Cipher.java">org/apache/hadoop/hbase/io/crypto/Cipher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.Decryptor.java">org/apache/hadoop/hbase/io/crypto/Decryptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.Encryption.java">org/apache/hadoop/hbase/io/crypto/Encryption.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.Encryptor.java">org/apache/hadoop/hbase/io/crypto/Encryptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.KeyProvider.java">org/apache/hadoop/hbase/io/crypto/KeyProvider.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.aes.CryptoAES.java">org/apache/hadoop/hbase/io/crypto/aes/CryptoAES.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.CopyKeyDataBlockEncoder.java">org/apache/hadoop/hbase/io/encoding/CopyKeyDataBlockEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.DataBlockEncoding.java">org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder.java">org/apache/hadoop/hbase/io/encoding/DiffKeyDeltaEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.EncodedDataBlock.java">org/apache/hadoop/hbase/io/encoding/EncodedDataBlock.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.FastDiffDeltaEncoder.java">org/apache/hadoop/hbase/io/encoding/FastDiffDeltaEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder.java">org/apache/hadoop/hbase/io/encoding/PrefixKeyDeltaEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.TestDataBlockEncoders.java">org/apache/hadoop/hbase/io/encoding/TestDataBlockEncoders.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.TestEncodedSeekers.java">org/apache/hadoop/hbase/io/encoding/TestEncodedSeekers.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hadoopbackport.ThrottledInputStream.java">org/apache/hadoop/hbase/io/hadoopbackport/ThrottledInputStream.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.BlockCache.java">org/apache/hadoop/hbase/io/hfile/BlockCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.BlockCacheKey.java">org/apache/hadoop/hbase/io/hfile/BlockCacheKey.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.BlockCacheUtil.java">org/apache/hadoop/hbase/io/hfile/BlockCacheUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.BlockCachesIterator.java">org/apache/hadoop/hbase/io/hfile/BlockCachesIterator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.BlockType.java">org/apache/hadoop/hbase/io/hfile/BlockType.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CacheConfig.java">org/apache/hadoop/hbase/io/hfile/CacheConfig.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CacheStats.java">org/apache/hadoop/hbase/io/hfile/CacheStats.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CacheTestUtils.java">org/apache/hadoop/hbase/io/hfile/CacheTestUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CacheableDeserializer.java">org/apache/hadoop/hbase/io/hfile/CacheableDeserializer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CacheableDeserializerIdManager.java">org/apache/hadoop/hbase/io/hfile/CacheableDeserializerIdManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.ChecksumUtil.java">org/apache/hadoop/hbase/io/hfile/ChecksumUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CombinedBlockCache.java">org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CompoundBloomFilter.java">org/apache/hadoop/hbase/io/hfile/CompoundBloomFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CompoundBloomFilterBase.java">org/apache/hadoop/hbase/io/hfile/CompoundBloomFilterBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CompoundBloomFilterWriter.java">org/apache/hadoop/hbase/io/hfile/CompoundBloomFilterWriter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CorruptHFileException.java">org/apache/hadoop/hbase/io/hfile/CorruptHFileException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.FixedFileTrailer.java">org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileBlockIndex.java">org/apache/hadoop/hbase/io/hfile/HFileBlockIndex.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>37</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileDataBlockEncoder.java">org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileInfo.java">org/apache/hadoop/hbase/io/hfile/HFileInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFilePrettyPrinter.java">org/apache/hadoop/hbase/io/hfile/HFilePrettyPrinter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileScanner.java">org/apache/hadoop/hbase/io/hfile/HFileScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileUtil.java">org/apache/hadoop/hbase/io/hfile/HFileUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileWriterImpl.java">org/apache/hadoop/hbase/io/hfile/HFileWriterImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.KVGenerator.java">org/apache/hadoop/hbase/io/hfile/KVGenerator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.LruAdaptiveBlockCache.java">org/apache/hadoop/hbase/io/hfile/LruAdaptiveBlockCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.LruCachedBlock.java">org/apache/hadoop/hbase/io/hfile/LruCachedBlock.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.LruCachedBlockQueue.java">org/apache/hadoop/hbase/io/hfile/LruCachedBlockQueue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.NanoTimer.java">org/apache/hadoop/hbase/io/hfile/NanoTimer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.NoOpDataBlockEncoder.java">org/apache/hadoop/hbase/io/hfile/NoOpDataBlockEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.PrefetchExecutor.java">org/apache/hadoop/hbase/io/hfile/PrefetchExecutor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.RandomKeyValueUtil.java">org/apache/hadoop/hbase/io/hfile/RandomKeyValueUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestCacheConfig.java">org/apache/hadoop/hbase/io/hfile/TestCacheConfig.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestCacheOnWrite.java">org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestCachedBlockQueue.java">org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestChecksum.java">org/apache/hadoop/hbase/io/hfile/TestChecksum.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestFixedFileTrailer.java">org/apache/hadoop/hbase/io/hfile/TestFixedFileTrailer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestForceCacheImportantBlocks.java">org/apache/hadoop/hbase/io/hfile/TestForceCacheImportantBlocks.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestHFile.java">org/apache/hadoop/hbase/io/hfile/TestHFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestHFileBlock.java">org/apache/hadoop/hbase/io/hfile/TestHFileBlock.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestHFileBlockIndex.java">org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestHFileDataBlockEncoder.java">org/apache/hadoop/hbase/io/hfile/TestHFileDataBlockEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestHFileWriterV3.java">org/apache/hadoop/hbase/io/hfile/TestHFileWriterV3.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestLruAdaptiveBlockCache.java">org/apache/hadoop/hbase/io/hfile/TestLruAdaptiveBlockCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestLruBlockCache.java">org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestPrefetch.java">org/apache/hadoop/hbase/io/hfile/TestPrefetch.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestScannerSelectionUsingKeyRange.java">org/apache/hadoop/hbase/io/hfile/TestScannerSelectionUsingKeyRange.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TinyLfuBlockCache.java">org/apache/hadoop/hbase/io/hfile/TinyLfuBlockCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocator.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.BucketCacheStats.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketCacheStats.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.BucketProtoUtils.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketProtoUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.ByteBufferIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/ByteBufferIOEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.CachedEntryQueue.java">org/apache/hadoop/hbase/io/hfile/bucket/CachedEntryQueue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.FileIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/FileIOEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.FileMmapIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/FileMmapIOEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.IOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/IOEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.TestBucketCache.java">org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.TestBucketWriterThread.java">org/apache/hadoop/hbase/io/hfile/bucket/TestBucketWriterThread.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.TestFileIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/TestFileIOEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.util.Dictionary.java">org/apache/hadoop/hbase/io/util/Dictionary.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.util.LRUDictionary.java">org/apache/hadoop/hbase/io/util/LRUDictionary.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.util.MemorySizeUtil.java">org/apache/hadoop/hbase/io/util/MemorySizeUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.util.StreamUtils.java">org/apache/hadoop/hbase/io/util/StreamUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.AbstractRpcClient.java">org/apache/hadoop/hbase/ipc/AbstractRpcClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.AdaptiveLifoCoDelCallQueue.java">org/apache/hadoop/hbase/ipc/AdaptiveLifoCoDelCallQueue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.BlockingRpcCallback.java">org/apache/hadoop/hbase/ipc/BlockingRpcCallback.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.BlockingRpcConnection.java">org/apache/hadoop/hbase/ipc/BlockingRpcConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.BufferCallBeforeInitHandler.java">org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.BufferChain.java">org/apache/hadoop/hbase/ipc/BufferChain.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.CallQueueInfo.java">org/apache/hadoop/hbase/ipc/CallQueueInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.CallRunner.java">org/apache/hadoop/hbase/ipc/CallRunner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.CellBlockBuilder.java">org/apache/hadoop/hbase/ipc/CellBlockBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.java">org/apache/hadoop/hbase/ipc/CoprocessorRpcUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.DelegatingHBaseRpcController.java">org/apache/hadoop/hbase/ipc/DelegatingHBaseRpcController.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.FailedServers.java">org/apache/hadoop/hbase/ipc/FailedServers.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.FifoRpcScheduler.java">org/apache/hadoop/hbase/ipc/FifoRpcScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.HBaseRpcController.java">org/apache/hadoop/hbase/ipc/HBaseRpcController.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.HBaseRpcControllerImpl.java">org/apache/hadoop/hbase/ipc/HBaseRpcControllerImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.IPCUtil.java">org/apache/hadoop/hbase/ipc/IPCUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.IntegrationTestRpcClient.java">org/apache/hadoop/hbase/ipc/IntegrationTestRpcClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.MasterFifoRpcScheduler.java">org/apache/hadoop/hbase/ipc/MasterFifoRpcScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.MetricsHBaseServer.java">org/apache/hadoop/hbase/ipc/MetricsHBaseServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyRpcServerPreambleHandler.java">org/apache/hadoop/hbase/ipc/NettyRpcServerPreambleHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyRpcServerRequestDecoder.java">org/apache/hadoop/hbase/ipc/NettyRpcServerRequestDecoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyRpcServerResponseEncoder.java">org/apache/hadoop/hbase/ipc/NettyRpcServerResponseEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyServerRpcConnection.java">org/apache/hadoop/hbase/ipc/NettyServerRpcConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.PriorityFunction.java">org/apache/hadoop/hbase/ipc/PriorityFunction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RWQueueRpcExecutor.java">org/apache/hadoop/hbase/ipc/RWQueueRpcExecutor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcCall.java">org/apache/hadoop/hbase/ipc/RpcCall.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcCallContext.java">org/apache/hadoop/hbase/ipc/RpcCallContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcClientFactory.java">org/apache/hadoop/hbase/ipc/RpcClientFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcExecutor.java">org/apache/hadoop/hbase/ipc/RpcExecutor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcScheduler.java">org/apache/hadoop/hbase/ipc/RpcScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcSchedulerContext.java">org/apache/hadoop/hbase/ipc/RpcSchedulerContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcServer.java">org/apache/hadoop/hbase/ipc/RpcServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcServerFactory.java">org/apache/hadoop/hbase/ipc/RpcServerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcServerInterface.java">org/apache/hadoop/hbase/ipc/RpcServerInterface.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.ServerRpcConnection.java">org/apache/hadoop/hbase/ipc/ServerRpcConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.java">org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.SimpleRpcServer.java">org/apache/hadoop/hbase/ipc/SimpleRpcServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.SimpleRpcServerResponder.java">org/apache/hadoop/hbase/ipc/SimpleRpcServerResponder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.SimpleServerRpcConnection.java">org/apache/hadoop/hbase/ipc/SimpleServerRpcConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.TestBufferChain.java">org/apache/hadoop/hbase/ipc/TestBufferChain.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.TestFifoRpcScheduler.java">org/apache/hadoop/hbase/ipc/TestFifoRpcScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.TestIPCUtil.java">org/apache/hadoop/hbase/ipc/TestIPCUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.TestRpcMetrics.java">org/apache/hadoop/hbase/ipc/TestRpcMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.log.HBaseMarkers.java">org/apache/hadoop/hbase/log/HBaseMarkers.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.Driver.java">org/apache/hadoop/hbase/mapred/Driver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.GroupingTableMap.java">org/apache/hadoop/hbase/mapred/GroupingTableMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.HRegionPartitioner.java">org/apache/hadoop/hbase/mapred/HRegionPartitioner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.IdentityTableMap.java">org/apache/hadoop/hbase/mapred/IdentityTableMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.IdentityTableReduce.java">org/apache/hadoop/hbase/mapred/IdentityTableReduce.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.MultiTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.RowCounter.java">org/apache/hadoop/hbase/mapred/RowCounter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableInputFormat.java">org/apache/hadoop/hbase/mapred/TableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableInputFormatBase.java">org/apache/hadoop/hbase/mapred/TableInputFormatBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableMap.java">org/apache/hadoop/hbase/mapred/TableMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableMapReduceUtil.java">org/apache/hadoop/hbase/mapred/TableMapReduceUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableOutputFormat.java">org/apache/hadoop/hbase/mapred/TableOutputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableRecordReader.java">org/apache/hadoop/hbase/mapred/TableRecordReader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableReduce.java">org/apache/hadoop/hbase/mapred/TableReduce.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapred/TableSnapshotInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableSplit.java">org/apache/hadoop/hbase/mapred/TableSplit.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestGroupingTableMap.java">org/apache/hadoop/hbase/mapred/TestGroupingTableMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestIdentityTableMap.java">org/apache/hadoop/hbase/mapred/TestIdentityTableMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestRowCounter.java">org/apache/hadoop/hbase/mapred/TestRowCounter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestTableInputFormat.java">org/apache/hadoop/hbase/mapred/TestTableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestTableMapReduce.java">org/apache/hadoop/hbase/mapred/TestTableMapReduce.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestTableMapReduceUtil.java">org/apache/hadoop/hbase/mapred/TestTableMapReduceUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CellCounter.java">org/apache/hadoop/hbase/mapreduce/CellCounter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CellCreator.java">org/apache/hadoop/hbase/mapreduce/CellCreator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CellSerialization.java">org/apache/hadoop/hbase/mapreduce/CellSerialization.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CellSortReducer.java">org/apache/hadoop/hbase/mapreduce/CellSortReducer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CopyTable.java">org/apache/hadoop/hbase/mapreduce/CopyTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.DefaultVisibilityExpressionResolver.java">org/apache/hadoop/hbase/mapreduce/DefaultVisibilityExpressionResolver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.Driver.java">org/apache/hadoop/hbase/mapreduce/Driver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.Export.java">org/apache/hadoop/hbase/mapreduce/Export.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.ExportUtils.java">org/apache/hadoop/hbase/mapreduce/ExportUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.GroupingTableMapper.java">org/apache/hadoop/hbase/mapreduce/GroupingTableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.HFileInputFormat.java">org/apache/hadoop/hbase/mapreduce/HFileInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.java">org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.HRegionPartitioner.java">org/apache/hadoop/hbase/mapreduce/HRegionPartitioner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.HashTable.java">org/apache/hadoop/hbase/mapreduce/HashTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.IdentityTableMapper.java">org/apache/hadoop/hbase/mapreduce/IdentityTableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.IdentityTableReducer.java">org/apache/hadoop/hbase/mapreduce/IdentityTableReducer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.Import.java">org/apache/hadoop/hbase/mapreduce/Import.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.ImportTsv.java">org/apache/hadoop/hbase/mapreduce/ImportTsv.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.IntegrationTestBulkLoad.java">org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.IntegrationTestImportTsv.java">org/apache/hadoop/hbase/mapreduce/IntegrationTestImportTsv.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.IntegrationTestTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/IntegrationTestTableSnapshotInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MapreduceTestingShim.java">org/apache/hadoop/hbase/mapreduce/MapreduceTestingShim.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableHFileOutputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableHFileOutputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableInputFormatTestBase.java">org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatTestBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableOutputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableOutputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableSnapshotInputFormatImpl.java">org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormatImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultithreadedTableMapper.java">org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MutationSerialization.java">org/apache/hadoop/hbase/mapreduce/MutationSerialization.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.PutCombiner.java">org/apache/hadoop/hbase/mapreduce/PutCombiner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.PutSortReducer.java">org/apache/hadoop/hbase/mapreduce/PutSortReducer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.ResultSerialization.java">org/apache/hadoop/hbase/mapreduce/ResultSerialization.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.RoundRobinTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.RowCounter.java">org/apache/hadoop/hbase/mapreduce/RowCounter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.SimpleTotalOrderPartitioner.java">org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.SyncTable.java">org/apache/hadoop/hbase/mapreduce/SyncTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.java">org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableMapper.java">org/apache/hadoop/hbase/mapreduce/TableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableOutputCommitter.java">org/apache/hadoop/hbase/mapreduce/TableOutputCommitter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableOutputFormat.java">org/apache/hadoop/hbase/mapreduce/TableOutputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableRecordReader.java">org/apache/hadoop/hbase/mapreduce/TableRecordReader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl.java">org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableReducer.java">org/apache/hadoop/hbase/mapreduce/TableReducer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormatImpl.java">org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestGroupingTableMapper.java">org/apache/hadoop/hbase/mapreduce/TestGroupingTableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestHBaseMRTestingUtility.java">org/apache/hadoop/hbase/mapreduce/TestHBaseMRTestingUtility.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestHFileOutputFormat2.java">org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestHRegionPartitioner.java">org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportExport.java">org/apache/hadoop/hbase/mapreduce/TestImportExport.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTSVWithOperationAttributes.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTSVWithTTLs.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTSVWithVisibilityLabels.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithVisibilityLabels.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTsv.java">org/apache/hadoop/hbase/mapreduce/TestImportTsv.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestMultiTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestMultiTableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormatBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestMultithreadedTableMapper.java">org/apache/hadoop/hbase/mapreduce/TestMultithreadedTableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestRoundRobinTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TestRoundRobinTableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestRowCounter.java">org/apache/hadoop/hbase/mapreduce/TestRowCounter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TestTableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTableInputFormatScanBase.java">org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScanBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTableMapReduce.java">org/apache/hadoop/hbase/mapreduce/TestTableMapReduce.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTableMapReduceBase.java">org/apache/hadoop/hbase/mapreduce/TestTableMapReduceBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTimeRangeMapRed.java">org/apache/hadoop/hbase/mapreduce/TestTimeRangeMapRed.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TextSortReducer.java">org/apache/hadoop/hbase/mapreduce/TextSortReducer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TsvImporterMapper.java">org/apache/hadoop/hbase/mapreduce/TsvImporterMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper.java">org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.VisibilityExpressionResolver.java">org/apache/hadoop/hbase/mapreduce/VisibilityExpressionResolver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication.java">org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.AbstractTestDLS.java">org/apache/hadoop/hbase/master/AbstractTestDLS.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.AssignmentVerificationReport.java">org/apache/hadoop/hbase/master/AssignmentVerificationReport.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.ClusterSchema.java">org/apache/hadoop/hbase/master/ClusterSchema.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.ClusterSchemaServiceImpl.java">org/apache/hadoop/hbase/master/ClusterSchemaServiceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.ClusterStatusPublisher.java">org/apache/hadoop/hbase/master/ClusterStatusPublisher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.DrainingServerTracker.java">org/apache/hadoop/hbase/master/DrainingServerTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.HMaster.java">org/apache/hadoop/hbase/master/HMaster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.HMasterCommandLine.java">org/apache/hadoop/hbase/master/HMasterCommandLine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.HbckChore.java">org/apache/hadoop/hbase/master/HbckChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MasterCoprocessorHost.java">org/apache/hadoop/hbase/master/MasterCoprocessorHost.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MasterFileSystem.java">org/apache/hadoop/hbase/master/MasterFileSystem.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MasterRpcServices.java">org/apache/hadoop/hbase/master/MasterRpcServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MasterServices.java">org/apache/hadoop/hbase/master/MasterServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MasterStatusServlet.java">org/apache/hadoop/hbase/master/MasterStatusServlet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MasterWalManager.java">org/apache/hadoop/hbase/master/MasterWalManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MetricsAssignmentManager.java">org/apache/hadoop/hbase/master/MetricsAssignmentManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MetricsMaster.java">org/apache/hadoop/hbase/master/MetricsMaster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MetricsMasterWrapperImpl.java">org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MockRegionServer.java">org/apache/hadoop/hbase/master/MockRegionServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.RackManager.java">org/apache/hadoop/hbase/master/RackManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.RegionPlacementMaintainer.java">org/apache/hadoop/hbase/master/RegionPlacementMaintainer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.RegionServerTracker.java">org/apache/hadoop/hbase/master/RegionServerTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.RegionState.java">org/apache/hadoop/hbase/master/RegionState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.ServerListener.java">org/apache/hadoop/hbase/master/ServerListener.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.ServerManager.java">org/apache/hadoop/hbase/master/ServerManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.SnapshotOfRegionAssignmentFromMeta.java">org/apache/hadoop/hbase/master/SnapshotOfRegionAssignmentFromMeta.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.SnapshotSentinel.java">org/apache/hadoop/hbase/master/SnapshotSentinel.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.SplitLogManager.java">org/apache/hadoop/hbase/master/SplitLogManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.SplitOrMergeTracker.java">org/apache/hadoop/hbase/master/SplitOrMergeTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestActiveMasterManager.java">org/apache/hadoop/hbase/master/TestActiveMasterManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestDeadServer.java">org/apache/hadoop/hbase/master/TestDeadServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestHMasterCommandLine.java">org/apache/hadoop/hbase/master/TestHMasterCommandLine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterFailoverBalancerPersistence.java">org/apache/hadoop/hbase/master/TestMasterFailoverBalancerPersistence.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterMetricsWrapper.java">org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterNoCluster.java">org/apache/hadoop/hbase/master/TestMasterNoCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterOperationsForRegionReplicas.java">org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterStatusServlet.java">org/apache/hadoop/hbase/master/TestMasterStatusServlet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterTransitions.java">org/apache/hadoop/hbase/master/TestMasterTransitions.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestRegionPlacement.java">org/apache/hadoop/hbase/master/TestRegionPlacement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestRegionPlacement2.java">org/apache/hadoop/hbase/master/TestRegionPlacement2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestSplitWALManager.java">org/apache/hadoop/hbase/master/TestSplitWALManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestWarmupRegion.java">org/apache/hadoop/hbase/master/TestWarmupRegion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>19</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.AssignProcedure.java">org/apache/hadoop/hbase/master/assignment/AssignProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.AssignmentManagerUtil.java">org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.GCMergedRegionsProcedure.java">org/apache/hadoop/hbase/master/assignment/GCMergedRegionsProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.GCMultipleMergedRegionsProcedure.java">org/apache/hadoop/hbase/master/assignment/GCMultipleMergedRegionsProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.GCRegionProcedure.java">org/apache/hadoop/hbase/master/assignment/GCRegionProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.RegionStateStore.java">org/apache/hadoop/hbase/master/assignment/RegionStateStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.RegionStates.java">org/apache/hadoop/hbase/master/assignment/RegionStates.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.RegionTransitionProcedure.java">org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.TestAssignmentOnRSCrash.java">org/apache/hadoop/hbase/master/assignment/TestAssignmentOnRSCrash.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.TestRegionSplitAndSeparateChildren.java">org/apache/hadoop/hbase/master/assignment/TestRegionSplitAndSeparateChildren.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.TestRegionStates.java">org/apache/hadoop/hbase/master/assignment/TestRegionStates.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.TestSplitTableRegionProcedure.java">org/apache/hadoop/hbase/master/assignment/TestSplitTableRegionProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.BalancerChore.java">org/apache/hadoop/hbase/master/balancer/BalancerChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.BalancerTestBase.java">org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>72</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>59</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.ClusterLoadState.java">org/apache/hadoop/hbase/master/balancer/ClusterLoadState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.ClusterStatusChore.java">org/apache/hadoop/hbase/master/balancer/ClusterStatusChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.FavoredStochasticBalancer.java">org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory.java">org/apache/hadoop/hbase/master/balancer/LoadBalancerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
-<td><a href="#org.apache.hadoop.hbase.master.balancer.LoadBalancerPerformanceEvaluation.java">org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.java</a></td>
-<td>0</td>
-<td>0</td>
-<td>1</td></tr>
 <tr class="b">
-<td><a href="#org.apache.hadoop.hbase.master.balancer.LocalityBasedCandidateGenerator.java">org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.java</a></td>
+<td><a href="#org.apache.hadoop.hbase.master.balancer.LoadBalancerPerformanceEvaluation.java">org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
@@ -3512,7 +3502,7 @@
 <td><a href="#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>26</td></tr>
+<td>24</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.TestBalancerStatusTagInJMXMetrics.java">org/apache/hadoop/hbase/master/balancer/TestBalancerStatusTagInJMXMetrics.java</a></td>
 <td>0</td>
@@ -7384,7 +7374,7 @@
 <tr class="b">
 <td>annotation</td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_annotation.html#MissingDeprecated">MissingDeprecated</a></td>
-<td>6</td>
+<td>5</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>blocks</td>
@@ -7399,7 +7389,7 @@
 <tr class="a">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_blocks.html#NeedBraces">NeedBraces</a></td>
-<td>1131</td>
+<td>1127</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>coding</td>
@@ -7453,7 +7443,7 @@
 <li>sortStaticImportsAlphabetically: <tt>&quot;true&quot;</tt></li>
 <li>groups: <tt>&quot;*,org.apache.hbase.thirdparty,org.apache.hadoop.hbase.shaded&quot;</tt></li>
 <li>option: <tt>&quot;top&quot;</tt></li></ul></td>
-<td>690</td>
+<td>689</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td></td>
@@ -7483,7 +7473,7 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation">JavadocTagContinuationIndentation</a>
 <ul>
 <li>offset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>525</td>
+<td>526</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td></td>
@@ -7864,99 +7854,78 @@
 <td>Unused import - org.apache.zookeeper.data.Stat.</td>
 <td>32</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.ChoreService.java">org/apache/hadoop/hbase/ChoreService.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>413</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>429</td></tr></table></div>
-<div class="section">
 <h3 id="org.apache.hadoop.hbase.ClientMetaTableAccessor.java">org/apache/hadoop/hbase/ClientMetaTableAccessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>167</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>192</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>223</td></tr>
+<td>192</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>223</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>236</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ClusterId.java">org/apache/hadoop/hbase/ClusterId.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -7965,13 +7934,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ClusterManager.java">org/apache/hadoop/hbase/ClusterManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -7980,37 +7949,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.CompoundConfiguration.java">org/apache/hadoop/hbase/CompoundConfiguration.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 3, expected level should be 4.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>183</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 6, expected level should be 8.</td>
 <td>198</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -8019,13 +7988,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.CoprocClusterManager.java">org/apache/hadoop/hbase/CoprocClusterManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -8034,13 +8003,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.Coprocessor.java">org/apache/hadoop/hbase/Coprocessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -8049,25 +8018,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.DistributedHBaseCluster.java">org/apache/hadoop/hbase/DistributedHBaseCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>453</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -8076,13 +8045,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ExtendedCell.java">org/apache/hadoop/hbase/ExtendedCell.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -8091,19 +8060,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HBaseCluster.java">org/apache/hadoop/hbase/HBaseCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>372</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -8112,13 +8081,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HBaseClusterManager.java">org/apache/hadoop/hbase/HBaseClusterManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -8127,31 +8096,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HBaseConfiguration.java">org/apache/hadoop/hbase/HBaseConfiguration.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -8160,19 +8129,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HBaseIOException.java">org/apache/hadoop/hbase/HBaseIOException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>41</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -8181,144 +8150,138 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HBaseTestingUtility.java">org/apache/hadoop/hbase/HBaseTestingUtility.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>354</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>356</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 7, expected level should be 8.</td>
 <td>432</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 9, expected level should be 10.</td>
 <td>433</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 9, expected level should be 10.</td>
 <td>434</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 9, expected level should be 10.</td>
 <td>435</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call rparen' has incorrect indentation level 7, expected level should be 8.</td>
 <td>436</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>448</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>509</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>513</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>521</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>525</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>533</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>543</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>558</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>562</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>563</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>564</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>576</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>580</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>581</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>597</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
@@ -8327,851 +8290,857 @@
 <td>597</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>597</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>751</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>795</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>1249</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1260</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1334</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1349</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1361</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1362</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1363</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1365</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1380</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1393</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1415</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1423</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1431</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1439</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1447</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1448</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1450</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1453</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1459</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1460</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1462</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1465</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1475</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1476</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1478</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1481</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1487</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1488</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1489</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1491</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1495</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1505</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1506</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1508</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1511</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1517</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1518</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1520</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1528</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1530</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1532</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1541</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1542</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1543</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1545</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>1625</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1646</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 9, expected level should be 8.</td>
 <td>1653</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1985</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1993</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1994</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1995</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1996</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1997</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2000</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2042</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2092</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2103</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2222</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>2225</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2326</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2470</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2471</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2472</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2474</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>2478</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2641</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2642</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2846</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
 <td>2884</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2915</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2917</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2918</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2919</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'while' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>2930</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>3009</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3103</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>3160</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3181</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3182</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3281</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3282</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>3285</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>3290</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3298</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3299</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3315</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3316</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3328</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3349</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3381</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>3385</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3437</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3438</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3439</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3440</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3441</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3481</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3482</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3507</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3516</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3529</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>3549</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>3579</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3638</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3639</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rparen' has incorrect indentation level 48, expected level should be 2.</td>
 <td>3659</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>3677</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>3896</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>3981</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>3983</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>4017</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>4058</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>4060</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>4138</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>4146</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>4154</td></tr>
+<td>4146</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>4154</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>4155</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HFilePerformanceEvaluation.java">org/apache/hadoop/hbase/HFilePerformanceEvaluation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.ImmutableBytesWritable' import.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.CacheConfig' import.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>118</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>185</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>186</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>187</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>190</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>205</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>206</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>207</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>329</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>560</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>561</td></tr>
+<td>560</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>561</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>562</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HRegionLocation.java">org/apache/hadoop/hbase/HRegionLocation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -9180,19 +9149,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HTestConst.java">org/apache/hadoop/hbase/HTestConst.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Collections' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -9201,13 +9170,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HadoopShims.java">org/apache/hadoop/hbase/HadoopShims.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -9216,97 +9185,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HealthChecker.java">org/apache/hadoop/hbase/HealthChecker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>110</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>111</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>113</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>114</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>117</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>118</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>119</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>120</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>121</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>122</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -9315,13 +9284,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestBackupRestore.java">org/apache/hadoop/hbase/IntegrationTestBackupRestore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -9330,319 +9299,319 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestDDLMasterFailover.java">org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 5 should be on the previous line.</td>
 <td>396</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>419</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>506</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>667</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 16, expected level should be one of the following: 10, 43, 44.</td>
 <td>705</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>705</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>720</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>780</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>854</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>855</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>856</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>857</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>858</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>859</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>860</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>861</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>862</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>863</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 12, expected level should be 14.</td>
 <td>866</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 14, expected level should be 16.</td>
 <td>867</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 12, expected level should be 14.</td>
 <td>868</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>869</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>870</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>871</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>872</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>873</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>874</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>875</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>876</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>877</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>878</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>879</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 12, expected level should be 14.</td>
 <td>881</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 14, expected level should be 16.</td>
 <td>882</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 12, expected level should be 14.</td>
 <td>883</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>884</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>885</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>886</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>887</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>888</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 12, expected level should be 14.</td>
 <td>890</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 14, expected level should be 16.</td>
 <td>891</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 12, expected level should be 14.</td>
 <td>892</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>893</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>894</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>895</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>896</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>897</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>898</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>899</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>919</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -9651,67 +9620,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestIngest.java">org/apache/hadoop/hbase/IntegrationTestIngest.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>71</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>72</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 7, expected level should be 6.</td>
 <td>144</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 9, expected level should be 8.</td>
 <td>145</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -9720,25 +9689,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestIngestWithACL.java">org/apache/hadoop/hbase/IntegrationTestIngestWithACL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>99</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -9747,13 +9716,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestIngestWithEncryption.java">org/apache/hadoop/hbase/IntegrationTestIngestWithEncryption.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -9762,64 +9731,64 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestIngestWithMOB.java">org/apache/hadoop/hbase/IntegrationTestIngestWithMOB.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>61</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>62</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>63</td></tr>
+<td>62</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>63</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>64</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestIngestWithVisibilityLabels.java">org/apache/hadoop/hbase/IntegrationTestIngestWithVisibilityLabels.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 43.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 52.</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -9828,19 +9797,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestManyRegions.java">org/apache/hadoop/hbase/IntegrationTestManyRegions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -9849,19 +9818,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestMetaReplicas.java">org/apache/hadoop/hbase/IntegrationTestMetaReplicas.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -9870,43 +9839,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestRegionReplicaPerf.java">org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>125</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>149</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>294</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
@@ -9915,37 +9884,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestingUtility.java">org/apache/hadoop/hbase/IntegrationTestingUtility.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>120</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -9954,754 +9923,754 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.KeyValue.java">org/apache/hadoop/hbase/KeyValue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>99</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>357</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>369</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>378</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>415</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>429</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>444</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>460</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>480</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>499</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>516</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>537</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>549</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>550</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>551</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>552</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>553</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>554</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>555</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>556</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>557</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>558</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>559</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>575</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>610</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>619</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>620</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>624</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
 <td>625</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>646</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>662</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>663</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>664</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>665</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>666</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>667</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>668</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>669</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>670</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>671</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>672</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>673</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>674</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>675</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>676</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>702</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>723</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>724</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>760</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>761</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>762</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>763</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>764</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>765</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>880</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1106</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1586</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1587</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1589</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1608</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1609</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1770</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1771</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1781</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1782</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1783</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1784</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1785</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1786</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1882</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1883</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1893</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1894</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1895</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1896</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1897</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1898</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>1924</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1941</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1942</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1943</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1944</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1945</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1946</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1947</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2088</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2089</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2137</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2139</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2140</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2184</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2185</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2264</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2266</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2267</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2275</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2276</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2278</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2279</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2284</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2296</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2297</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2299</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2315</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2316</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2317</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2319</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2436</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2437</td></tr>
+<td>2436</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>2437</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>2438</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.KeyValueTestUtil.java">org/apache/hadoop/hbase/KeyValueTestUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>53</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -10710,164 +10679,164 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.KeyValueUtil.java">org/apache/hadoop/hbase/KeyValueUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>65</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>105</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>117</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>210</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>211</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>249</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>403</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>434</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>460</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>470</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>499</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>500</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>502</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>699</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>722</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>731</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>740</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>741</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>742</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>761</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>770</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>771</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>774</td></tr>
+<td>771</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>774</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
@@ -10875,164 +10844,164 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.LocalHBaseCluster.java">org/apache/hadoop/hbase/LocalHBaseCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>78</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>101</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>104</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>108</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>134</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>139</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>206</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>220</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>252</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>263</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>279</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>280</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>286</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>287</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>358</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>359</td></tr>
+<td>358</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>359</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
@@ -11040,46 +11009,46 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.MetaMockingUtil.java">org/apache/hadoop/hbase/MetaMockingUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>32</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>39</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>52</td></tr>
+<td>39</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>52</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>67</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.MetaMutationAnnotation.java">org/apache/hadoop/hbase/MetaMutationAnnotation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -11088,152 +11057,152 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.MiniHBaseCluster.java">org/apache/hadoop/hbase/MiniHBaseCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>66</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>75</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>232</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>410</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>490</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>491</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>492</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>533</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>618</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>619</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>620</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>635</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>648</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>654</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>745</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>758</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>780</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>795</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>828</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>838</td></tr>
+<td>828</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>838</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
@@ -11241,26 +11210,26 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.MultithreadedTestUtil.java">org/apache/hadoop/hbase/MultithreadedTestUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>70</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>84</td></tr>
+<td>70</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>84</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
@@ -11268,25 +11237,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.NamespaceDescriptor.java">org/apache/hadoop/hbase/NamespaceDescriptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class NamespaceDescriptor should be declared as final.</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class Builder should be declared as final.</td>
 <td>162</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -11295,13 +11264,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.NotAllMetaRegionsOnlineException.java">org/apache/hadoop/hbase/NotAllMetaRegionsOnlineException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -11310,60 +11279,54 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.PerformanceEvaluation.java">org/apache/hadoop/hbase/PerformanceEvaluation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>278</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 11, expected level should be one of the following: 10, 12.</td>
 <td>326</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>341</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>453</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>506</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call rparen' has incorrect indentation level 6, expected level should be 4.</td>
 <td>605</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>630</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>746</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
@@ -11378,191 +11341,197 @@
 <td>746</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>746</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1216</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>1217</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1225</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1232</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1241</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1246</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>1299</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>1305</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>1308</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1403</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1405</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>1411</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>1453</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1569</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>1575</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>1833</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>1881</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1992</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>2175</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>2340</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>2425</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>2467</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2583</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2584</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>2616</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>2671</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>2685</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 118).</td>
 <td>2689</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>2693</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 294 lines (max allowed is 150).</td>
 <td>2722</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2880</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -11571,13 +11540,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.PerformanceEvaluationCommons.java">org/apache/hadoop/hbase/PerformanceEvaluationCommons.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -11586,370 +11555,370 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.PrivateCellUtil.java">org/apache/hadoop/hbase/PrivateCellUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>887</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>888</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>889</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>907</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>908</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>909</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1055</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1056</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1057</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1058</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1059</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1081</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1274</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1275</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2211</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2213</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2246</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2261</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2337</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2338</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2352</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2353</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2367</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2383</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2384</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2399</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2417</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2433</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2449</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2466</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2486</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2502</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2519</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2523</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2526</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2530</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>2531</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2536</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2549</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2562</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2575</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2588</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2666</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2811</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2825</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2834</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2839</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2847</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2913</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2914</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2915</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2916</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2938</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2957</td></tr>
+<td>2938</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>2957</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>2976</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.QosTestHelper.java">org/apache/hadoop/hbase/QosTestHelper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.regionserver.AnnotationReadingPriorityFunction' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -11958,94 +11927,94 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.RegionLocations.java">org/apache/hadoop/hbase/RegionLocations.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>69</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>146</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>149</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>150</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>152</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>173</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>213</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>285</td></tr>
+<td>213</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>285</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>288</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.RegionStateListener.java">org/apache/hadoop/hbase/RegionStateListener.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -12054,73 +12023,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ScanPerformanceEvaluation.java">org/apache/hadoop/hbase/ScanPerformanceEvaluation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 155).</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>197</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>199</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>254</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>256</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>324</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>326</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>329</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>380</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>382</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -12129,13 +12098,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.SplitLogCounters.java">org/apache/hadoop/hbase/SplitLogCounters.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -12144,31 +12113,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.SplitLogTask.java">org/apache/hadoop/hbase/SplitLogTask.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -12177,25 +12146,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.StripeCompactionsPerformanceEvaluation.java">org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -12204,13 +12173,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableDescriptors.java">org/apache/hadoop/hbase/TableDescriptors.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -12219,124 +12188,124 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableName.java">org/apache/hadoop/hbase/TableName.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>132</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>136</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>139</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>141</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>143</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>144</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>145</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>193</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>198</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>437</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>438</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>505</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>558</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>559</td></tr>
+<td>558</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>559</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>576</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TagBuilder.java">org/apache/hadoop/hbase/TagBuilder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -12345,19 +12314,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TagBuilderFactory.java">org/apache/hadoop/hbase/TagBuilderFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.nio.ByteBuffer.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -12366,13 +12335,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TagType.java">org/apache/hadoop/hbase/TagType.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -12381,13 +12350,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClientClusterStatus.java">org/apache/hadoop/hbase/TestClientClusterStatus.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -12396,13 +12365,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestFSTableDescriptorForceCreation.java">org/apache/hadoop/hbase/TestFSTableDescriptorForceCreation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -12411,43 +12380,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestGlobalMemStoreSize.java">org/apache/hadoop/hbase/TestGlobalMemStoreSize.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>153</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>154</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>155</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>158</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -12456,19 +12425,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestIOFencing.java">org/apache/hadoop/hbase/TestIOFencing.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -12477,13 +12446,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestLocalHBaseCluster.java">org/apache/hadoop/hbase/TestLocalHBaseCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -12492,19 +12461,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMetaTableAccessor.java">org/apache/hadoop/hbase/TestMetaTableAccessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>230</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -12513,13 +12482,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMovedRegionCache.java">org/apache/hadoop/hbase/TestMovedRegionCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -12528,25 +12497,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMultiVersions.java">org/apache/hadoop/hbase/TestMultiVersions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>87</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 5, expected level should be one of the following: 4, 6.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -12555,13 +12524,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestNamespace.java">org/apache/hadoop/hbase/TestNamespace.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -12570,13 +12539,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestNodeHealthCheckChore.java">org/apache/hadoop/hbase/TestNodeHealthCheckChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -12585,146 +12554,146 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestPartialResultsFromClientSide.java">org/apache/hadoop/hbase/TestPartialResultsFromClientSide.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>141</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>176</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>209</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>247</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>320</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>340</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>374</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>394</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>402</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>405</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>455</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>557</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>648</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>649</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>650</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>659</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>677</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>678</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>679</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>683</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>689</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>690</td></tr>
+<td>689</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>690</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
@@ -12732,50 +12701,50 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestRegionRebalancing.java">org/apache/hadoop/hbase/TestRegionRebalancing.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization lcurly' has incorrect indentation level 12, expected level should be one of the following: 10, 25, 27.</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>107</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>108</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>112</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>192</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>221</td></tr>
+<td>192</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>221</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 8, expected level should be 6.</td>
@@ -12783,13 +12752,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestSerialization.java">org/apache/hadoop/hbase/TestSerialization.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -12798,25 +12767,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestStochasticBalancerJmxMetrics.java">org/apache/hadoop/hbase/TestStochasticBalancerJmxMetrics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>211</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -12825,13 +12794,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestTagBuilder.java">org/apache/hadoop/hbase/TestTagBuilder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -12840,112 +12809,112 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TimestampTestBase.java">org/apache/hadoop/hbase/TimestampTestBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Durability' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>107</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>127</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>203</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>209</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>231</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>236</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>250</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>262</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>267</td></tr>
+<td>262</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>267</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>273</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ZNodeClearer.java">org/apache/hadoop/hbase/ZNodeClearer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>108</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -12954,13 +12923,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.backup.FailedArchiveException.java">org/apache/hadoop/hbase/backup/FailedArchiveException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -12969,74 +12938,74 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.backup.HFileArchiver.java">org/apache/hadoop/hbase/backup/HFileArchiver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class HFileArchiver should be declared as final.</td>
 <td>62</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
 <td>72</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>74</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
 <td>75</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 2, 4.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>353</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>666</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>672</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>689</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>691</td></tr>
+<td>689</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>691</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
@@ -13044,13 +13013,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.backup.regionserver.LogRollBackupSubprocedurePool.java">org/apache/hadoop/hbase/backup/regionserver/LogRollBackupSubprocedurePool.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -13059,67 +13028,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.ChaosAgent.java">org/apache/hadoop/hbase/chaos/ChaosAgent.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.io.File.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Map.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>478</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>554</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>555</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>557</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>558</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>559</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>560</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -13128,13 +13097,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.ChaosConstants.java">org/apache/hadoop/hbase/chaos/ChaosConstants.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -13143,25 +13112,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.ChaosService.java">org/apache/hadoop/hbase/chaos/ChaosService.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -13170,13 +13139,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.ChaosUtils.java">org/apache/hadoop/hbase/chaos/ChaosUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -13185,199 +13154,199 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.factories.MasterKillingMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/MasterKillingMonkeyFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>45</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>50</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>60</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>63</td></tr>
+<td>60</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>63</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>66</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.factories.MobSlowDeterministicMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/MobSlowDeterministicMonkeyFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>92</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>97</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>99</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>104</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>106</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>107</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>108</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>109</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
-<td>110</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
-<td>112</td></tr>
+<td>110</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
+<td>112</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>117</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.factories.MonkeyConstants.java">org/apache/hadoop/hbase/chaos/factories/MonkeyConstants.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>InterfaceIsType</td>
@@ -13386,13 +13355,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.factories.MonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/MonkeyFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -13401,116 +13370,116 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.factories.NoKillMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/NoKillMonkeyFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>50</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>59</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>62</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>63</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>64</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>66</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>67</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>71</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>74</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>79</td></tr>
+<td>74</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>79</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
@@ -13518,412 +13487,412 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.factories.ServerKillingMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/ServerKillingMonkeyFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>51</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>52</td></tr>
+<td>51</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>52</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>63</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.factories.SlowDeterministicMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/SlowDeterministicMonkeyFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>86</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>97</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>99</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>107</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>109</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>112</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>117</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>139</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>142</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>145</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>148</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>157</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>163</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>166</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>169</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>172</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>175</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>178</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>181</td></tr>
+<td>178</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>181</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>184</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.factories.StressAssignmentManagerMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/StressAssignmentManagerMonkeyFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>62</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>67</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>68</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>69</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>71</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>80</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>81</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>82</td></tr>
+<td>81</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>82</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>91</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.monkies.PolicyBasedChaosMonkey.java">org/apache/hadoop/hbase/chaos/monkies/PolicyBasedChaosMonkey.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -13932,13 +13901,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.policies.PeriodicPolicy.java">org/apache/hadoop/hbase/chaos/policies/PeriodicPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -13947,13 +13916,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.policies.TwoConcurrentActionPolicy.java">org/apache/hadoop/hbase/chaos/policies/TwoConcurrentActionPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -13962,13 +13931,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.AbstractClientScanner.java">org/apache/hadoop/hbase/client/AbstractClientScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -13977,19 +13946,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.AbstractResponse.java">org/apache/hadoop/hbase/client/AbstractResponse.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -13998,19 +13967,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Action.java">org/apache/hadoop/hbase/client/Action.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 28 should have line break after.</td>
 <td>79</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -14019,175 +13988,175 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Admin.java">org/apache/hadoop/hbase/client/Admin.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>199</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>234</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>247</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>250</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>385</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>604</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>618</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>634</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>644</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>656</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>675</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>681</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>689</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>793</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>794</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1229</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>1317</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1349</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1546</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1550</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1668</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1670</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1681</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1683</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 125).</td>
 <td>1699</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1860</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -14196,19 +14165,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Append.java">org/apache/hadoop/hbase/client/Append.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>131</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -14217,61 +14186,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.AsyncAdmin.java">org/apache/hadoop/hbase/client/AsyncAdmin.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>206</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1145</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1152</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1159</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1271</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1309</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -14280,25 +14249,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.AsyncBatchRpcRetryingCaller.java">org/apache/hadoop/hbase/client/AsyncBatchRpcRetryingCaller.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'loc' must be private and have accessor methods.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'actions' must be private and have accessor methods.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
@@ -14307,31 +14276,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.AsyncClientScanner.java">org/apache/hadoop/hbase/client/AsyncClientScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'loc' must be private and have accessor methods.</td>
 <td>119</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'stub' must be private and have accessor methods.</td>
 <td>123</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'controller' must be private and have accessor methods.</td>
 <td>125</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
@@ -14340,13 +14309,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.AsyncScanSingleRegionRpcRetryingCaller.java">org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -14355,13 +14324,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.AsyncTableImpl.java">org/apache/hadoop/hbase/client/AsyncTableImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -14370,13 +14339,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.BatchScanResultCache.java">org/apache/hadoop/hbase/client/BatchScanResultCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -14385,13 +14354,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.BufferingScanResultConsumer.java">org/apache/hadoop/hbase/client/BufferingScanResultConsumer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -14400,19 +14369,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ClientIdGenerator.java">org/apache/hadoop/hbase/client/ClientIdGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Addressing' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -14421,13 +14390,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ClientUtil.java">org/apache/hadoop/hbase/client/ClientUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -14436,13 +14405,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ClusterStatusListener.java">org/apache/hadoop/hbase/client/ClusterStatusListener.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -14451,13 +14420,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ColumnCountOnRowFilter.java">org/apache/hadoop/hbase/client/ColumnCountOnRowFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -14466,85 +14435,85 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ColumnFamilyDescriptor.java">org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.compress.Compression' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>47</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 4, expected level should be 6.</td>
 <td>48</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>49</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 4, expected level should be 6.</td>
 <td>50</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 4, expected level should be 6.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 4, expected level should be 6.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>56</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 2, expected level should be 4.</td>
 <td>57</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>198</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -14553,313 +14522,313 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder.java">org/apache/hadoop/hbase/client/ColumnFamilyDescriptorBuilder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class ColumnFamilyDescriptorBuilder should be declared as final.</td>
 <td>48</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>95</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>98</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>101</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>111</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>146</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 121).</td>
 <td>167</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>179</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>275</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>326</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>328</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>356</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>521</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>615</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>616</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>633</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>671</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>772</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>816</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>823</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>863</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>878</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>881</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>893</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>931</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>944</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>975</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>994</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>1007</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>1020</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>1033</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>1046</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1051</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>1060</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1065</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>1158</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>1171</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1201</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1204</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>1207</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1238</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1255</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1270</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1285</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>1335</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1349</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -14868,19 +14837,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.CompactType.java">org/apache/hadoop/hbase/client/CompactType.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -14889,13 +14858,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.CompleteScanResultCache.java">org/apache/hadoop/hbase/client/CompleteScanResultCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -14904,13 +14873,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ConnectionFactory.java">org/apache/hadoop/hbase/client/ConnectionFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -14919,19 +14888,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ConnectionUtils.java">org/apache/hadoop/hbase/client/ConnectionUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.net.InetAddress.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -14940,101 +14909,101 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Delete.java">org/apache/hadoop/hbase/client/Delete.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>111</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>112</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>128</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>129</td></tr>
+<td>128</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>129</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>162</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Get.java">org/apache/hadoop/hbase/client/Get.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.filter.Filter' import.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>135</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>136</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>145</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>294</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>304</td></tr>
+<td>294</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>304</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
@@ -15042,13 +15011,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.HConnectionTestingUtility.java">org/apache/hadoop/hbase/client/HConnectionTestingUtility.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -15057,13 +15026,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.MetricsConnection.java">org/apache/hadoop/hbase/client/MetricsConnection.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -15072,19 +15041,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.MultiResponse.java">org/apache/hadoop/hbase/client/MultiResponse.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -15093,166 +15062,166 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Mutation.java">org/apache/hadoop/hbase/client/Mutation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>174</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>175</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>176</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>177</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>287</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>366</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>376</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>380</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>387</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>399</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>403</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>410</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>412</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>414</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>415</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>513</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>577</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>592</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>607</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>709</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>718</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>719</td></tr>
+<td>718</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>719</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>721</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Operation.java">org/apache/hadoop/hbase/client/Operation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.JsonMapper' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -15261,13 +15230,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.PackagePrivateFieldAccessor.java">org/apache/hadoop/hbase/client/PackagePrivateFieldAccessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -15276,118 +15245,118 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Put.java">org/apache/hadoop/hbase/client/Put.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>69</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>71</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>100</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>101</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>102</td></tr>
+<td>101</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>102</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>103</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Query.java">org/apache/hadoop/hbase/client/Query.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.common.collect.ArrayListMultimap' import.</td>
 <td>34</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>140</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>173</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -15396,13 +15365,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RawAsyncHBaseAdmin.java">org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -15411,133 +15380,133 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RegionInfo.java">org/apache/hadoop/hbase/client/RegionInfo.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>130</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 2, expected level should be 4.</td>
 <td>160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>165</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>243</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>244</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>245</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>312</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>388</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>392</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>398</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>402</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>416</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>428</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>596</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>630</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>642</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>674</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>690</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>694</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -15546,13 +15515,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RegionInfoBuilder.java">org/apache/hadoop/hbase/client/RegionInfoBuilder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -15561,109 +15530,109 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RegionInfoDisplay.java">org/apache/hadoop/hbase/client/RegionInfoDisplay.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>RedundantImport</td>
 <td>Redundant import from the same package - org.apache.hadoop.hbase.client.RegionInfo.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>RedundantImport</td>
 <td>Redundant import from the same package - org.apache.hadoop.hbase.client.RegionInfoBuilder.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'RegionInfoBuilder' has incorrect indentation level 4, expected level should be 6.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>62</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>68</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>69</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>119</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -15672,13 +15641,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RegionLocator.java">org/apache/hadoop/hbase/client/RegionLocator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -15687,56 +15656,56 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RegionReplicaUtil.java">org/apache/hadoop/hbase/client/RegionReplicaUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>58</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>75</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>93</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
-<td>128</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
-<td>132</td></tr>
+<td>128</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
+<td>132</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
@@ -15744,58 +15713,58 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RequestController.java">org/apache/hadoop/hbase/client/RequestController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>67</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>101</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>104</td></tr>
+<td>101</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>104</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>115</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RequestControllerFactory.java">org/apache/hadoop/hbase/client/RequestControllerFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ReflectionUtils' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -15804,85 +15773,85 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Result.java">org/apache/hadoop/hbase/client/Result.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>258</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>260</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>366</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>370</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>398</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>679</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>854</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>871</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>872</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>890</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -15891,25 +15860,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ResultScanner.java">org/apache/hadoop/hbase/client/ResultScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.metrics.ScanMetrics' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -15918,13 +15887,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RetriesExhaustedException.java">org/apache/hadoop/hbase/client/RetriesExhaustedException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -15933,25 +15902,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException.java">org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>48</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -15960,13 +15929,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RowAccess.java">org/apache/hadoop/hbase/client/RowAccess.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -15975,37 +15944,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Scan.java">org/apache/hadoop/hbase/client/Scan.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>337</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>704</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>714</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>746</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -16014,43 +15983,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.SimpleRequestController.java">org/apache/hadoop/hbase/client/SimpleRequestController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>45</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ConcurrentMapUtils.computeIfAbsent' import.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda' has incorrect indentation level 12, expected level should be one of the following: 6, 8.</td>
 <td>239</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -16059,13 +16028,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.SimpleScanResultConsumer.java">org/apache/hadoop/hbase/client/SimpleScanResultConsumer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -16074,13 +16043,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.SnapshotDescription.java">org/apache/hadoop/hbase/client/SnapshotDescription.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -16089,259 +16058,259 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Table.java">org/apache/hadoop/hbase/client/Table.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>131</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>281</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>282</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>283</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>285</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>286</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>508</td></tr>
+<td>286</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>508</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>531</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TableDescriptor.java">org/apache/hadoop/hbase/client/TableDescriptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>102</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>122</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>132</td></tr>
+<td>122</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>132</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>169</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TableDescriptorBuilder.java">org/apache/hadoop/hbase/client/TableDescriptorBuilder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class TableDescriptorBuilder should be declared as final.</td>
 <td>59</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>157</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>336</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>618</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>740</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>751</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>762</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>788</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>866</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>967</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1001</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1063</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>1083</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1139</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1286</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>1321</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1330</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1331</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1337</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1370</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1383</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1396</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1452</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1490</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1573</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -16350,232 +16319,232 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TableState.java">org/apache/hadoop/hbase/client/TableState.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>50</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>53</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>56</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>57</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>58</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>59</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>62</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>63</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>78</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>79</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>80</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>87</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>183</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>236</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>237</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>241</td></tr>
+<td>237</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>241</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>242</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAdmin.java">org/apache/hadoop/hbase/client/TestAdmin.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -16584,25 +16553,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAdmin2.java">org/apache/hadoop/hbase/client/TestAdmin2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>183</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 1, expected level should be 2.</td>
 <td>392</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -16611,37 +16580,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAdmin4.java">org/apache/hadoop/hbase/client/TestAdmin4.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.EnumSet.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.ClusterMetrics.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.slf4j.Logger.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -16650,25 +16619,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAdminShell.java">org/apache/hadoop/hbase/client/TestAdminShell.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.io.IOException.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.jruby.embed.PathType.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -16677,25 +16646,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAdminShell2.java">org/apache/hadoop/hbase/client/TestAdminShell2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.io.IOException.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.jruby.embed.PathType.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -16704,13 +16673,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAsyncClusterAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncClusterAdminApi.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -16719,13 +16688,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAsyncNamespaceAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncNamespaceAdminApi.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -16734,55 +16703,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAsyncQuotaAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncQuotaAdminApi.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>87</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>90</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -16791,38 +16760,38 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAsyncRegionAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>64</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>139</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>292</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>299</td></tr>
+<td>292</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>299</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
@@ -16830,25 +16799,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAsyncRegionAdminApi2.java">org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>236</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -16857,13 +16826,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAsyncReplicationAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncReplicationAdminApi.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
@@ -16872,13 +16841,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAsyncTableAdminApi2.java">org/apache/hadoop/hbase/client/TestAsyncTableAdminApi2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -16887,13 +16856,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAsyncTableAdminApi3.java">org/apache/hadoop/hbase/client/TestAsyncTableAdminApi3.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -16902,13 +16871,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAsyncTableGetMultiThreaded.java">org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreaded.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -16917,19 +16886,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAsyncTableScanMetrics.java">org/apache/hadoop/hbase/client/TestAsyncTableScanMetrics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>118</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -16938,13 +16907,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAsyncTableScanner.java">org/apache/hadoop/hbase/client/TestAsyncTableScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -16953,26 +16922,26 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAvoidCellReferencesIntoShippedBlocks.java">org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>97</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>120</td></tr>
+<td>97</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>120</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
@@ -16980,38 +16949,38 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestBlockEvictionFromClient.java">org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>108</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>129</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>137</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>147</td></tr>
+<td>137</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>147</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 14, expected level should be 12.</td>
@@ -17019,67 +16988,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestCatalogReplicaLoadBalanceSimpleSelector.java">org/apache/hadoop/hbase/client/TestCatalogReplicaLoadBalanceSimpleSelector.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>120</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' has incorrect indentation level 8, expected level should be 10.</td>
 <td>121</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>122</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>124</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>127</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>128</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -17088,19 +17057,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestCheckAndMutate.java">org/apache/hadoop/hbase/client/TestCheckAndMutate.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -17109,13 +17078,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestColumnFamilyDescriptorBuilder.java">org/apache/hadoop/hbase/client/TestColumnFamilyDescriptorBuilder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -17124,19 +17093,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestEnableTable.java">org/apache/hadoop/hbase/client/TestEnableTable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>153</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -17145,49 +17114,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestFromClientSide3.java">org/apache/hadoop/hbase/client/TestFromClientSide3.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>371</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>976</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1146</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>1148</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -17196,19 +17165,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestFromClientSideNoCodec.java">org/apache/hadoop/hbase/client/TestFromClientSideNoCodec.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>58</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -17217,19 +17186,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestFromClientSideScanExcpetion.java">org/apache/hadoop/hbase/client/TestFromClientSideScanExcpetion.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -17238,37 +17207,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestGetScanColumnsWithNewVersionBehavior.java">org/apache/hadoop/hbase/client/TestGetScanColumnsWithNewVersionBehavior.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.List' import.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.ArrayList' import.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -17277,19 +17246,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestImmutableScan.java">org/apache/hadoop/hbase/client/TestImmutableScan.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.junit.Assert.assertArrayEquals' import.</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -17298,13 +17267,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestIncrementsFromClientSide.java">org/apache/hadoop/hbase/client/TestIncrementsFromClientSide.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -17313,13 +17282,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestLimitedScanWithFilter.java">org/apache/hadoop/hbase/client/TestLimitedScanWithFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -17328,25 +17297,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestMetaCache.java">org/apache/hadoop/hbase/client/TestMetaCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>273</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>276</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -17355,13 +17324,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestMultiParallel.java">org/apache/hadoop/hbase/client/TestMultiParallel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -17370,238 +17339,238 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestMultipleTimestamps.java">org/apache/hadoop/hbase/client/TestMultipleTimestamps.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>47</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>65</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'IOException' has incorrect indentation level 2, expected level should be 4.</td>
 <td>175</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>318</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>349</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>374</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>399</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>438</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>439</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>440</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>453</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>454</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>455</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>456</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>457</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>460</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>472</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>474</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>478</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>494</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>495</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>496</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>513</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>514</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>515</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>527</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>528</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>529</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>536</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>537</td></tr>
+<td>536</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
+<td>537</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
 <td>544</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestPutDeleteEtcCellIteration.java">org/apache/hadoop/hbase/client/TestPutDeleteEtcCellIteration.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -17610,19 +17579,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestPutWithDelete.java">org/apache/hadoop/hbase/client/TestPutWithDelete.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -17631,25 +17600,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestQuotasShell.java">org/apache/hadoop/hbase/client/TestQuotasShell.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.io.IOException.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.jruby.embed.PathType.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -17658,25 +17627,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestRSGroupShell.java">org/apache/hadoop/hbase/client/TestRSGroupShell.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.io.IOException.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.jruby.embed.PathType.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -17685,13 +17654,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestRawAsyncTableLimitedScanWithFilter.java">org/apache/hadoop/hbase/client/TestRawAsyncTableLimitedScanWithFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -17700,13 +17669,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestRawAsyncTableScan.java">org/apache/hadoop/hbase/client/TestRawAsyncTableScan.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -17715,13 +17684,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestReplicaWithCluster.java">org/apache/hadoop/hbase/client/TestReplicaWithCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -17730,13 +17699,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestReplicasClient.java">org/apache/hadoop/hbase/client/TestReplicasClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -17745,85 +17714,85 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestResult.java">org/apache/hadoop/hbase/client/TestResult.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>77</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>418</td></tr>
+<td>77</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>418</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>482</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestScannerTimeout.java">org/apache/hadoop/hbase/client/TestScannerTimeout.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>65</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>92</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>102</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>133</td></tr>
+<td>102</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>133</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>179</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestScannersFromClientSide2.java">org/apache/hadoop/hbase/client/TestScannersFromClientSide2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -17832,13 +17801,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestServerBusyException.java">org/apache/hadoop/hbase/client/TestServerBusyException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -17847,25 +17816,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestShell.java">org/apache/hadoop/hbase/client/TestShell.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.io.IOException.</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.jruby.embed.PathType.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -17874,25 +17843,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestSmallReversedScanner.java">org/apache/hadoop/hbase/client/TestSmallReversedScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 117).</td>
 <td>119</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -17901,13 +17870,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestSnapshotCloneIndependence.java">org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -17916,13 +17885,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestSnapshotDFSTemporaryDirectory.java">org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -17931,19 +17900,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestSnapshotFromClient.java">org/apache/hadoop/hbase/client/TestSnapshotFromClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -17952,13 +17921,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestSnapshotMetadata.java">org/apache/hadoop/hbase/client/TestSnapshotMetadata.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -17967,13 +17936,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory.java">org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -17982,25 +17951,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestTableShell.java">org/apache/hadoop/hbase/client/TestTableShell.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.io.IOException.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.jruby.embed.PathType.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -18009,13 +17978,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestTableSnapshotScanner.java">org/apache/hadoop/hbase/client/TestTableSnapshotScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -18024,124 +17993,124 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestTimestampsFilter.java">org/apache/hadoop/hbase/client/TestTimestampsFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>68</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>92</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>105</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>231</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>264</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>335</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>336</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>354</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>355</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>371</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>372</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>390</td></tr>
+<td>372</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
+<td>390</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
 <td>391</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.VersionInfoUtil.java">org/apache/hadoop/hbase/client/VersionInfoUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.ipc.RpcCallContext' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18150,19 +18119,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.backoff.ClientBackoffPolicyFactory.java">org/apache/hadoop/hbase/client/backoff/ClientBackoffPolicyFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ReflectionUtils' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -18171,31 +18140,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.backoff.ServerStatistics.java">org/apache/hadoop/hbase/client/backoff/ServerStatistics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.RegionLoadStats' import.</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Map' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18204,19 +18173,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.coprocessor.Batch.java">org/apache/hadoop/hbase/client/coprocessor/Batch.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18225,19 +18194,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.coprocessor.DoubleColumnInterpreter.java">org/apache/hadoop/hbase/client/coprocessor/DoubleColumnInterpreter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>49</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18246,32 +18215,32 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.coprocessor.LongColumnInterpreter.java">org/apache/hadoop/hbase/client/coprocessor/LongColumnInterpreter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>49</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>58</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>67</td></tr>
+<td>58</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>67</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
@@ -18279,55 +18248,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.coprocessor.package-info.java">org/apache/hadoop/hbase/client/coprocessor/package-info.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 146).</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 200).</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 144).</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 206).</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>95</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>96</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 124).</td>
 <td>149</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18336,13 +18305,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.example.AsyncClientExample.java">org/apache/hadoop/hbase/client/example/AsyncClientExample.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -18351,31 +18320,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.locking.EntityLock.java">org/apache/hadoop/hbase/client/locking/EntityLock.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Threads' import.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>131</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>182</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18384,13 +18353,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.locking.TestEntityLocks.java">org/apache/hadoop/hbase/client/locking/TestEntityLocks.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18399,79 +18368,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.metrics.ScanMetrics.java">org/apache/hadoop/hbase/client/metrics/ScanMetrics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'countOfRPCcalls' must be private and have accessor methods.</td>
 <td>58</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'countOfRemoteRPCcalls' must be private and have accessor methods.</td>
 <td>63</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>68</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'sumOfMillisSecBetweenNexts' must be private and have accessor methods.</td>
 <td>68</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'countOfNSRE' must be private and have accessor methods.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'countOfBytesInResults' must be private and have accessor methods.</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'countOfBytesInRemoteResults' must be private and have accessor methods.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'countOfRegions' must be private and have accessor methods.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'countOfRPCRetries' must be private and have accessor methods.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
@@ -18480,106 +18449,106 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.metrics.ServerSideScanMetrics.java">org/apache/hadoop/hbase/client/metrics/ServerSideScanMetrics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'countOfRowsFiltered' must be private and have accessor methods.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'countOfRowsScanned' must be private and have accessor methods.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>64</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>75</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>83</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>91</td></tr>
+<td>83</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>91</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>92</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.codec.BaseDecoder.java">org/apache/hadoop/hbase/codec/BaseDecoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'edu.umd.cs.findbugs.annotations.NonNull' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>99</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18588,19 +18557,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.codec.BaseEncoder.java">org/apache/hadoop/hbase/codec/BaseEncoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>50</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18609,49 +18578,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.codec.CellCodec.java">org/apache/hadoop/hbase/codec/CellCodec.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>68</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>69</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>71</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18660,43 +18629,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.codec.CellCodecWithTags.java">org/apache/hadoop/hbase/codec/CellCodecWithTags.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>71</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>74</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18705,88 +18674,88 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.codec.CodecPerformance.java">org/apache/hadoop/hbase/codec/CodecPerformance.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>RedundantImport</td>
 <td>Redundant import from the same package - org.apache.hadoop.hbase.codec.CellCodec.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>RedundantImport</td>
 <td>Redundant import from the same package - org.apache.hadoop.hbase.codec.Codec.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>RedundantImport</td>
 <td>Redundant import from the same package - org.apache.hadoop.hbase.codec.KeyValueCodec.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>RedundantImport</td>
 <td>Redundant import from the same package - org.apache.hadoop.hbase.codec.MessageCodec.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>43</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>70</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>84</td></tr>
+<td>70</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>84</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>106</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.codec.MessageCodec.java">org/apache/hadoop/hbase/codec/MessageCodec.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.ByteBuffInputStream' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18795,46 +18764,46 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.codec.TestCellMessageCodec.java">org/apache/hadoop/hbase/codec/TestCellMessageCodec.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>90</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 118).</td>
-<td>102</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 118).</td>
-<td>103</td></tr>
+<td>102</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 118).</td>
+<td>103</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 118).</td>
 <td>104</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.constraint.BaseConstraint.java">org/apache/hadoop/hbase/constraint/BaseConstraint.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -18843,19 +18812,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.constraint.CheckConfigurationConstraint.java">org/apache/hadoop/hbase/constraint/CheckConfigurationConstraint.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>47</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18864,31 +18833,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.constraint.Constraint.java">org/apache/hadoop/hbase/constraint/Constraint.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 119).</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18897,13 +18866,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.constraint.ConstraintException.java">org/apache/hadoop/hbase/constraint/ConstraintException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -18912,37 +18881,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.constraint.package-info.java">org/apache/hadoop/hbase/constraint/package-info.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 120).</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 121).</td>
 <td>45</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 127).</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 155).</td>
 <td>64</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18951,13 +18920,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coordination.SplitLogManagerCoordination.java">org/apache/hadoop/hbase/coordination/SplitLogManagerCoordination.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18966,37 +18935,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coordination.ZKSplitLogManagerCoordination.java">org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'ignoreZKDeleteForTesting' must be private and have accessor methods.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>146</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>457</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>566</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -19005,64 +18974,64 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coordination.ZkSplitLogWorkerCoordination.java">org/apache/hadoop/hbase/coordination/ZkSplitLogWorkerCoordination.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>160</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>222</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>386</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>547</td></tr>
+<td>386</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>547</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>548</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.BaseEnvironment.java">org/apache/hadoop/hbase/coprocessor/BaseEnvironment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'impl' must be private and have accessor methods.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -19071,31 +19040,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.BulkLoadObserver.java">org/apache/hadoop/hbase/coprocessor/BulkLoadObserver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>57</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>58</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>68</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -19104,155 +19073,155 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.ColumnInterpreter.java">org/apache/hadoop/hbase/coprocessor/ColumnInterpreter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'Q' has incorrect indentation level 0, expected level should be 2.</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>64</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>66</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>68</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>105</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>123</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>124</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>143</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>149</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>156</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>163</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>170</td></tr>
+<td>163</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>170</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>178</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.CoprocessorException.java">org/apache/hadoop/hbase/coprocessor/CoprocessorException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>38</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>39</td></tr>
+<td>38</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>39</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
@@ -19260,91 +19229,91 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.CoprocessorHost.java">org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>38</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>142</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>459</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 12, expected level should be one of the following: 6, 8.</td>
 <td>485</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 14, expected level should be one of the following: 8, 10.</td>
 <td>487</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 16, expected level should be one of the following: 10, 12.</td>
 <td>488</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 14, expected level should be one of the following: 8, 10.</td>
 <td>489</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 14, expected level should be one of the following: 8, 10.</td>
 <td>490</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 12, expected level should be one of the following: 6, 8.</td>
 <td>491</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 10, expected level should be one of the following: 4, 6.</td>
 <td>492</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>617</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>660</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -19353,13 +19322,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.CoreCoprocessor.java">org/apache/hadoop/hbase/coprocessor/CoreCoprocessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -19368,13 +19337,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.HasMasterServices.java">org/apache/hadoop/hbase/coprocessor/HasMasterServices.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -19383,13 +19352,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.HasRegionServerServices.java">org/apache/hadoop/hbase/coprocessor/HasRegionServerServices.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -19398,13 +19367,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.MasterCoprocessor.java">org/apache/hadoop/hbase/coprocessor/MasterCoprocessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -19413,128 +19382,128 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.MasterObserver.java">org/apache/hadoop/hbase/coprocessor/MasterObserver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>510</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>518</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>526</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>534</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>551</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>552</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>554</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>614</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>615</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>1167</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1434</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1442</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1450</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1458</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1466</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1474</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1482</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1490</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1498</td></tr>
+<td>1490</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1498</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
@@ -19542,19 +19511,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.MetricsCoprocessor.java">org/apache/hadoop/hbase/coprocessor/MetricsCoprocessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.metrics.MetricRegistries' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -19563,13 +19532,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.ObserverContext.java">org/apache/hadoop/hbase/coprocessor/ObserverContext.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -19578,19 +19547,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.ObserverContextImpl.java">org/apache/hadoop/hbase/coprocessor/ObserverContextImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
@@ -19599,13 +19568,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.RegionCoprocessor.java">org/apache/hadoop/hbase/coprocessor/RegionCoprocessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -19614,13 +19583,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment.java">org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -19629,103 +19598,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.RegionObserver.java">org/apache/hadoop/hbase/coprocessor/RegionObserver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>249</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>320</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>321</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>479</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>553</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>561</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>562</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>573</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>574</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1265</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1266</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1402</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1413</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1453</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1457</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -19734,13 +19703,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor.java">org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -19749,19 +19718,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.RegionServerObserver.java">org/apache/hadoop/hbase/coprocessor/RegionServerObserver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>95</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -19770,37 +19739,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver.java">org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>476</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 123).</td>
 <td>503</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 124).</td>
 <td>533</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 126).</td>
 <td>548</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -19809,13 +19778,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestCoprocessorInterface.java">org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -19824,13 +19793,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestCoreMasterCoprocessor.java">org/apache/hadoop/hbase/coprocessor/TestCoreMasterCoprocessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -19839,19 +19808,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestCoreRegionCoprocessor.java">org/apache/hadoop/hbase/coprocessor/TestCoreRegionCoprocessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>69</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -19860,13 +19829,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestCoreRegionServerCoprocessor.java">org/apache/hadoop/hbase/coprocessor/TestCoreRegionServerCoprocessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -19875,61 +19844,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestMasterCoprocessorExceptionWithAbort.java">org/apache/hadoop/hbase/coprocessor/TestMasterCoprocessorExceptionWithAbort.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 3, expected level should be 4.</td>
 <td>102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>183</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>187</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>189</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>190</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>191</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -19938,49 +19907,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestMasterCoprocessorExceptionWithRemove.java">org/apache/hadoop/hbase/coprocessor/TestMasterCoprocessorExceptionWithRemove.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>167</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>169</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>170</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>171</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>173</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>174</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -19989,31 +19958,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestMasterObserver.java">org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>613</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>620</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 33 should have line break after.</td>
 <td>782</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -20022,19 +19991,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestOpenTableInCoprocessor.java">org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.junit.After' import.</td>
 <td>48</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -20043,19 +20012,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestRegionObserverBypass.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>103</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -20064,25 +20033,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestRegionObserverForAddingMutationsFromCoprocessors.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>229</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>320</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -20091,151 +20060,151 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestRegionObserverInterface.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>145</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>152</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>153</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>164</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>165</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>181</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>192</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>205</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>237</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>262</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>300</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>452</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>506</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>532</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>569</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>643</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>717</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>718</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>747</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>771</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>776</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>786</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>921</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -20244,49 +20213,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestRegionObserverScannerOpenHook.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>231</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>258</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>277</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>285</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>293</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>354</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -20295,13 +20264,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.WALCoprocessor.java">org/apache/hadoop/hbase/coprocessor/WALCoprocessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -20310,13 +20279,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment.java">org/apache/hadoop/hbase/coprocessor/WALCoprocessorEnvironment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -20325,19 +20294,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.WALObserver.java">org/apache/hadoop/hbase/coprocessor/WALObserver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -20346,13 +20315,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.package-info.java">org/apache/hadoop/hbase/coprocessor/package-info.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -20361,56 +20330,56 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.errorhandling.ForeignException.java">org/apache/hadoop/hbase/errorhandling/ForeignException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>67</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>68</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>106</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>157</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>160</td></tr>
+<td>157</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>160</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
@@ -20418,13 +20387,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher.java">org/apache/hadoop/hbase/errorhandling/ForeignExceptionDispatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -20433,19 +20402,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.errorhandling.TestForeignExceptionDispatcher.java">org/apache/hadoop/hbase/errorhandling/TestForeignExceptionDispatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>49</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -20454,19 +20423,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.errorhandling.TimeoutExceptionInjector.java">org/apache/hadoop/hbase/errorhandling/TimeoutExceptionInjector.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.EnvironmentEdgeManager' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -20475,13 +20444,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil.java">org/apache/hadoop/hbase/exceptions/ClientExceptionsUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -20490,40 +20459,40 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.exceptions.FailedSanityCheckException.java">org/apache/hadoop/hbase/exceptions/FailedSanityCheckException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>38</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>45</td></tr>
+<td>38</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>45</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>46</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.exceptions.MergeRegionException.java">org/apache/hadoop/hbase/exceptions/MergeRegionException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -20532,13 +20501,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.executor.EventHandler.java">org/apache/hadoop/hbase/executor/EventHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -20547,545 +20516,545 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.executor.EventType.java">org/apache/hadoop/hbase/executor/EventType.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>49</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>67</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>79</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>92</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>99</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>112</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>118</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>124</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>130</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>136</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>142</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>155</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>161</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>167</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>173</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>191</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>197</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>209</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>215</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>223</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>228</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>235</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>241</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>248</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>255</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>262</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>269</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
-<td>276</td></tr>
+<td>269</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
+<td>276</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
 <td>283</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.executor.ExecutorService.java">org/apache/hadoop/hbase/executor/ExecutorService.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>265</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>334</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>335</td></tr>
+<td>334</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>335</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>336</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.executor.ExecutorType.java">org/apache/hadoop/hbase/executor/ExecutorType.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>41</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>45</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>46</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>47</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>48</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>49</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
-<td>50</td></tr>
+<td>49</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
+<td>50</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
 <td>51</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.favored.FavoredNodeAssignmentHelper.java">org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>141</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>142</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>143</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>196</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>210</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>259</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>264</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>347</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>421</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>488</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>489</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>492</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>494</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>495</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 5, expected level should be 6.</td>
 <td>497</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 7, expected level should be 8.</td>
 <td>498</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 5, expected level should be 6.</td>
 <td>500</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>502</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>503</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
-<td>504</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
-<td>505</td></tr>
+<td>504</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
+<td>505</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
@@ -21093,25 +21062,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.favored.FavoredNodeLoadBalancer.java">org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'segregateRegionsAndAssignRegionsWithFavoredNodes' has incorrect indentation level 2, expected level should be 4.</td>
 <td>248</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>250</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -21120,19 +21089,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.favored.FavoredNodesPromoter.java">org/apache/hadoop/hbase/favored/FavoredNodesPromoter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.RegionInfo' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -21141,37 +21110,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.favored.StartcodeAgnosticServerName.java">org/apache/hadoop/hbase/favored/StartcodeAgnosticServerName.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.ServerName' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>56</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -21180,19 +21149,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.favored.TestFavoredNodeAssignmentHelper.java">org/apache/hadoop/hbase/favored/TestFavoredNodeAssignmentHelper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'secondaryAndTertiaryRSPlacementHelper' has incorrect indentation level 2, expected level should be 4.</td>
 <td>288</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -21201,13 +21170,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.BigDecimalComparator.java">org/apache/hadoop/hbase/filter/BigDecimalComparator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -21216,55 +21185,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.BinaryComparator.java">org/apache/hadoop/hbase/filter/BinaryComparator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ByteBufferUtils' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -21273,55 +21242,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.BinaryPrefixComparator.java">org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ByteBufferUtils' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>99</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -21330,55 +21299,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.BitComparator.java">org/apache/hadoop/hbase/filter/BitComparator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>103</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>107</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -21387,37 +21356,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.ByteArrayComparable.java">org/apache/hadoop/hbase/filter/ByteArrayComparable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>64</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>72</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -21426,55 +21395,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.ColumnCountGetFilter.java">org/apache/hadoop/hbase/filter/ColumnCountGetFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.common.base.Preconditions' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>57</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>98</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>119</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -21483,79 +21452,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.ColumnPaginationFilter.java">org/apache/hadoop/hbase/filter/ColumnPaginationFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>183</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>187</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -21564,73 +21533,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.ColumnPrefixFilter.java">org/apache/hadoop/hbase/filter/ColumnPrefixFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ByteBufferUtils' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>114</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>121</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>142</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 3, expected level should be 4.</td>
 <td>142</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>143</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 3, expected level should be 4.</td>
 <td>143</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -21639,67 +21608,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.ColumnRangeFilter.java">org/apache/hadoop/hbase/filter/ColumnRangeFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>63</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>67</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>162</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>164</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>177</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>180</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>189</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -21708,43 +21677,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.CompareFilter.java">org/apache/hadoop/hbase/filter/CompareFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>156</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>174</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>180</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>182</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -21753,73 +21722,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.DependentColumnFilter.java">org/apache/hadoop/hbase/filter/DependentColumnFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>141</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>144</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>226</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>230</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'CompareOperator' has incorrect indentation level 4, expected level should be 6.</td>
 <td>238</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>254</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>256</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>262</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -21828,68 +21797,68 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.FamilyFilter.java">org/apache/hadoop/hbase/filter/FamilyFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 144).</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>117</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>121</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>122</td></tr>
+<td>121</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>122</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 1, expected level should be 2.</td>
@@ -21897,37 +21866,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.Filter.java">org/apache/hadoop/hbase/filter/Filter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'enum def rcurly' has incorrect indentation level 0, expected level should be 2.</td>
 <td>175</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>254</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -21936,19 +21905,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.FilterAllFilter.java">org/apache/hadoop/hbase/filter/FilterAllFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>57</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -21957,19 +21926,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.FilterBase.java">org/apache/hadoop/hbase/filter/FilterBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -21978,43 +21947,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.FilterList.java">org/apache/hadoop/hbase/filter/FilterList.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>205</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>229</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>235</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -22023,13 +21992,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.FilterListBase.java">org/apache/hadoop/hbase/filter/FilterListBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -22038,640 +22007,640 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.FilterListWithAND.java">org/apache/hadoop/hbase/filter/FilterListWithAND.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 133).</td>
 <td>75</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
 <td>86</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
 <td>87</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
 <td>89</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 198).</td>
-<td>90</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 198).</td>
-<td>91</td></tr>
+<td>90</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
+<td>Line is longer than 100 characters (found 198).</td>
+<td>91</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>143</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.FilterListWithOR.java">org/apache/hadoop/hbase/filter/FilterListWithOR.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>104</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>108</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>109</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>117</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 133).</td>
 <td>132</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 170).</td>
 <td>141</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 157).</td>
 <td>142</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 157).</td>
 <td>143</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 157).</td>
 <td>144</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 154).</td>
 <td>145</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 154).</td>
 <td>146</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 154).</td>
 <td>147</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 170).</td>
 <td>148</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>159</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>161</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>162</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>164</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>165</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>166</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>168</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>169</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>170</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>171</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>172</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>174</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>175</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>176</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>177</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>179</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>180</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>181</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>182</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>183</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>186</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>187</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>188</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>190</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>191</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>192</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>193</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>194</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>195</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>196</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>197</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>198</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>199</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>200</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>205</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>206</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>207</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>208</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>209</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>210</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>211</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>213</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>214</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>215</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>216</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>217</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>218</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>219</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>220</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>221</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>222</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>223</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>224</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>225</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>226</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>227</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>228</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>229</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>231</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>232</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>233</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>234</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>235</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>236</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>237</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>238</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -22680,13 +22649,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.FilterTestingCluster.java">org/apache/hadoop/hbase/filter/FilterTestingCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -22695,55 +22664,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.FilterWrapper.java">org/apache/hadoop/hbase/filter/FilterWrapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>67</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>71</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>107</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>162</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>166</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -22752,55 +22721,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter.java">org/apache/hadoop/hbase/filter/FirstKeyOnlyFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.common.base.Preconditions' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>58</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>97</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>115</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>119</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -22809,61 +22778,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.FirstKeyValueMatchingQualifiersFilter.java">org/apache/hadoop/hbase/filter/FirstKeyValueMatchingQualifiersFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>92</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>99</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>104</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>122</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -22872,202 +22841,202 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.FuzzyRowFilter.java">org/apache/hadoop/hbase/filter/FuzzyRowFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 120).</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 16, expected level should be one of the following: 10, 12.</td>
 <td>200</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 18, expected level should be one of the following: 12, 14.</td>
 <td>203</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 16, expected level should be one of the following: 10, 12.</td>
 <td>205</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 14, expected level should be one of the following: 8, 10.</td>
 <td>206</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>212</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>235</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>273</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>597</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>598</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>607</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>609</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>621</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>622</td></tr>
+<td>621</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>622</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>625</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.InclusiveStopFilter.java">org/apache/hadoop/hbase/filter/InclusiveStopFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>56</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>64</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>96</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>113</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>117</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -23076,49 +23045,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.KeyOnlyFilter.java">org/apache/hadoop/hbase/filter/KeyOnlyFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 26 should have line break after.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 42 should have line break after.</td>
 <td>56</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>106</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>110</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>127</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -23127,157 +23096,157 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.LongComparator.java">org/apache/hadoop/hbase/filter/LongComparator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ByteBufferUtils' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>66</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>67</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>72</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' has incorrect indentation level 8, expected level should be 4.</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 8, expected level should be 4.</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 12, expected level should be 6.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 8, expected level should be 4.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>87</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>92</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 4.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -23286,130 +23255,130 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.MultiRowRangeFilter.java">org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>191</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>194</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>206</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>235</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>237</td></tr>
+<td>235</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>237</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>241</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.MultipleColumnPrefixFilter.java">org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>134</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>161</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>162</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>176</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>177</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -23418,55 +23387,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.NullComparator.java">org/apache/hadoop/hbase/filter/NullComparator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>98</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -23475,25 +23444,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.PageFilter.java">org/apache/hadoop/hbase/filter/PageFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>66</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -23502,13 +23471,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.ParseConstants.java">org/apache/hadoop/hbase/filter/ParseConstants.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -23517,242 +23486,242 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.ParseFilter.java">org/apache/hadoop/hbase/filter/ParseFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Set' import.</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>124</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>191</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>214</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>227</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>243</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>277</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>305</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>393</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>488</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>526</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>552</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>579</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>609</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>639</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>660</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>682</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>705</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>748</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>778</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>780</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>782</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>784</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>786</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>788</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>790</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>792</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>802</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>803</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>810</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>812</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>814</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>816</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>819</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>821</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>831</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
-<td>852</td></tr>
+<td>831</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>852</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
@@ -23760,79 +23729,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.PrefixFilter.java">org/apache/hadoop/hbase/filter/PrefixFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ByteBufferUtils' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>57</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>59</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>121</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>125</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>142</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -23841,49 +23810,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.QualifierFilter.java">org/apache/hadoop/hbase/filter/QualifierFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>87</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>117</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -23892,61 +23861,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.RandomRowFilter.java">org/apache/hadoop/hbase/filter/RandomRowFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>46</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>62</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>129</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>142</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>146</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -23955,136 +23924,136 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.RegexStringComparator.java">org/apache/hadoop/hbase/filter/RegexStringComparator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>163</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>167</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>196</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>200</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>201</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>369</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>370</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>371</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>372</td></tr>
+<td>371</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>372</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>373</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.RowFilter.java">org/apache/hadoop/hbase/filter/RowFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>107</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>111</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>133</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -24093,97 +24062,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter.java">org/apache/hadoop/hbase/filter/SingleColumnValueExcludeFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException' import.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
 <td>97</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>141</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>145</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>171</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>175</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -24192,103 +24161,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.SingleColumnValueFilter.java">org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>129</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>130</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>131</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>174</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>219</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>272</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>318</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>322</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>347</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>351</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -24297,49 +24266,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.SkipFilter.java">org/apache/hadoop/hbase/filter/SkipFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>118</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>122</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>139</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>143</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -24348,55 +24317,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.SubstringComparator.java">org/apache/hadoop/hbase/filter/SubstringComparator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>106</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -24405,280 +24374,280 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestColumnPaginationFilter.java">org/apache/hadoop/hbase/filter/TestColumnPaginationFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 125).</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 1 should be on the previous line.</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>47</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>49</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>50</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>53</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>57</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>58</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>59</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>62</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>66</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>67</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>69</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>71</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 122).</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def lcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 5 should be on the previous line.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>86</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>87</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>96</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>97</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>99</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>100</td></tr>
+<td>99</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>100</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>101</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestColumnPrefixFilter.java">org/apache/hadoop/hbase/filter/TestColumnPrefixFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>127</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>198</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
@@ -24687,19 +24656,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestColumnRangeFilter.java">org/apache/hadoop/hbase/filter/TestColumnRangeFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -24708,1720 +24677,1720 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestDependentColumnFilter.java">org/apache/hadoop/hbase/filter/TestDependentColumnFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>148</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>149</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>150</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>151</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>154</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>164</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>235</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 120).</td>
 <td>249</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 6.</td>
 <td>255</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>256</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 6.</td>
 <td>257</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>258</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>259</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>261</td></tr>
+<td>259</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>261</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>262</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestFilter.java">org/apache/hadoop/hbase/filter/TestFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>438</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>439</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>440</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>441</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>442</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>443</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>445</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>446</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>447</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>448</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>449</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>450</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>452</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>453</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>454</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>455</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>456</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>457</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>459</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>460</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>461</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>462</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>463</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>464</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>466</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>467</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>468</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>469</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>470</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>471</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>473</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>474</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>475</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>476</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>477</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>478</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>577</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>594</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 34 should have line break after.</td>
 <td>610</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>635</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>656</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>670</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>684</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>690</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>698</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 159 lines (max allowed is 150).</td>
 <td>779</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>857</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>858</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>859</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>860</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>862</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>863</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>864</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>865</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>867</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>868</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>869</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>870</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>872</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>873</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>874</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>875</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>876</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>877</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>879</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>880</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>881</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>882</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>883</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>884</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>886</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>887</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>888</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>889</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>890</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>891</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>906</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>907</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>908</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>909</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>911</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>912</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>913</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>914</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>916</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>917</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>918</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>919</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>921</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>922</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>923</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>924</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>926</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>927</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>928</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>929</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>931</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>932</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>933</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>934</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1156</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1158</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1159</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1160</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1161</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1163</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1164</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1165</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1166</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1167</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1168</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1170</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1171</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1172</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1173</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1174</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1175</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1177</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1178</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1180</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1181</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1182</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1187</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1188</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1189</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1204</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1205</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1206</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1207</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1209</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1211</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1213</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1214</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1215</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1216</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1322</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1323</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1324</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1325</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1326</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1327</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1329</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1330</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1331</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1332</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1333</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1334</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1336</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1337</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1338</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1339</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1340</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1341</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1358</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1359</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1360</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1361</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1362</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1363</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1365</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1366</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1367</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1368</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1369</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1370</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1372</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1373</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1374</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1375</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1376</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1377</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1399</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1423</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1424</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1425</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1426</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1427</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1428</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'CompareOperator' has incorrect indentation level 4, expected level should be 6.</td>
 <td>1439</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>1440</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>1440</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1445</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1446</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1447</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1448</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1449</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1450</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1451</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1452</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1453</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'CompareOperator' has incorrect indentation level 4, expected level should be 6.</td>
 <td>1460</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>1461</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>1461</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1466</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1467</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1468</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1469</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1470</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1471</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1472</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1473</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1474</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1487</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1488</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1489</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1490</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1491</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1492</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1493</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1494</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1495</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1496</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1497</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1498</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1499</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1500</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1501</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1502</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1503</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1504</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1585</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1586</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1587</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1618</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1619</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1620</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1621</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1831</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1839</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1852</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1861</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1873</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1882</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1904</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1913</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>1931</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2097</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2132</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2155</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2159</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2161</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2165</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2166</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2167</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2170</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2171</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2172</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2175</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2176</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2177</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2181</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2182</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2183</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 34 should have line break after.</td>
 <td>2262</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>2300</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -26430,121 +26399,121 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestFilterList.java">org/apache/hadoop/hbase/filter/TestFilterList.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>124</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>190</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>238</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>276</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>286</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>296</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>304</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>337</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>375</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>399</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 36 should have line break after.</td>
 <td>485</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 36 should have line break after.</td>
 <td>500</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>508</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>514</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>517</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>529</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>534</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>567</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -26553,19 +26522,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestFilterListOrOperatorWithBlkCnt.java">org/apache/hadoop/hbase/filter/TestFilterListOrOperatorWithBlkCnt.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -26574,13 +26543,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestFilterWithScanLimits.java">org/apache/hadoop/hbase/filter/TestFilterWithScanLimits.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -26589,25 +26558,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestFilterWrapper.java">org/apache/hadoop/hbase/filter/TestFilterWrapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>107</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>107</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -26616,13 +26585,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestFirstKeyValueMatchingQualifiersFilter.java">org/apache/hadoop/hbase/filter/TestFirstKeyValueMatchingQualifiersFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -26631,38 +26600,38 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestFuzzyRowAndColumnRangeFilter.java">org/apache/hadoop/hbase/filter/TestFuzzyRowAndColumnRangeFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>71</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>79</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>87</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>95</td></tr>
+<td>87</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>95</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
@@ -26670,85 +26639,85 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestFuzzyRowFilterEndToEnd.java">org/apache/hadoop/hbase/filter/TestFuzzyRowFilterEndToEnd.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>108</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>130</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
 <td>133</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
 <td>134</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
 <td>135</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>174</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>365</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>410</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -26757,19 +26726,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestInclusiveStopFilter.java">org/apache/hadoop/hbase/filter/TestInclusiveStopFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>56</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -26778,19 +26747,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestMultiRowRangeFilter.java">org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -26799,55 +26768,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestMultipleColumnPrefixFilter.java">org/apache/hadoop/hbase/filter/TestMultipleColumnPrefixFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>129</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>130</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>207</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>256</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>257</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>267</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
@@ -26856,13 +26825,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestNullComparator.java">org/apache/hadoop/hbase/filter/TestNullComparator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -26871,19 +26840,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestPageFilter.java">org/apache/hadoop/hbase/filter/TestPageFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -26892,19 +26861,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestPrefixFilter.java">org/apache/hadoop/hbase/filter/TestPrefixFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -26913,25 +26882,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestRandomRowFilter.java">org/apache/hadoop/hbase/filter/TestRandomRowFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>49</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -26940,19 +26909,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestRegexComparator.java">org/apache/hadoop/hbase/filter/TestRegexComparator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -26961,13 +26930,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestScanRowPrefix.java">org/apache/hadoop/hbase/filter/TestScanRowPrefix.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -26976,64 +26945,64 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestSingleColumnValueExcludeFilter.java">org/apache/hadoop/hbase/filter/TestSingleColumnValueExcludeFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'CompareOperator' has incorrect indentation level 4, expected level should be 6.</td>
 <td>65</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>71</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
-<td>72</td></tr>
+<td>71</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
+<td>72</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
 <td>73</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TestSingleColumnValueFilter.java">org/apache/hadoop/hbase/filter/TestSingleColumnValueFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>62</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>264</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -27042,43 +27011,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.TimestampsFilter.java">org/apache/hadoop/hbase/filter/TimestampsFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.common.base.Preconditions' import.</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>58</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>206</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -27087,49 +27056,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.ValueFilter.java">org/apache/hadoop/hbase/filter/ValueFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>87</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>113</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>117</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -27138,55 +27107,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.WhileMatchFilter.java">org/apache/hadoop/hbase/filter/WhileMatchFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>69</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>117</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>134</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -27195,19 +27164,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.fs.HFileSystem.java">org/apache/hadoop/hbase/fs/HFileSystem.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -27216,13 +27185,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.fs.TestBlockReorderBlockLocation.java">org/apache/hadoop/hbase/fs/TestBlockReorderBlockLocation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -27231,31 +27200,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.fs.TestBlockReorderMultiBlocks.java">org/apache/hadoop/hbase/fs/TestBlockReorderMultiBlocks.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>157</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 14, expected level should be one of the following: 10, 12.</td>
 <td>159</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>160</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -27264,49 +27233,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.HttpServer.java">org/apache/hadoop/hbase/http/HttpServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>129</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 8, expected level should be 6.</td>
 <td>1038</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 12, expected level should be 8.</td>
 <td>1040</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rcurly' has incorrect indentation level 8, expected level should be 6.</td>
 <td>1042</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1043</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>1043</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -27315,31 +27284,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.HttpServerFunctionalTest.java">org/apache/hadoop/hbase/http/HttpServerFunctionalTest.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>105</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>106</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -27348,25 +27317,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.ProxyUserAuthenticationFilter.java">org/apache/hadoop/hbase/http/ProxyUserAuthenticationFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.security.UserGroupInformation' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -27375,49 +27344,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.TestHttpCookieFlag.java">org/apache/hadoop/hbase/http/TestHttpCookieFlag.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.File' import.</td>
 <td>17</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.net.HttpCookie' import.</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'javax.servlet.FilterChain' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'javax.servlet.ServletException' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.security.GeneralSecurityException' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -27426,43 +27395,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.TestProxyUserSpnegoHttpServer.java">org/apache/hadoop/hbase/http/TestProxyUserSpnegoHttpServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>201</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>206</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 153).</td>
 <td>206</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>211</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>211</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -27471,25 +27440,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.ByteBuffInputStream.java">org/apache/hadoop/hbase/io/ByteBuffInputStream.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -27498,64 +27467,64 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.ByteBufferOutputStream.java">org/apache/hadoop/hbase/io/ByteBufferOutputStream.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>62</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>63</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>64</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>65</td></tr>
+<td>64</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>65</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>66</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.CellOutputStream.java">org/apache/hadoop/hbase/io/CellOutputStream.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -27564,44 +27533,44 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.FSDataInputStreamWrapper.java">org/apache/hadoop/hbase/io/FSDataInputStreamWrapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>129</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>156</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>165</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>185</td></tr>
+<td>165</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>185</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
@@ -27609,127 +27578,127 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.FileLink.java">org/apache/hadoop/hbase/io/FileLink.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>141</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>147</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>162</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>214</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>262</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>302</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>305</td></tr>
+<td>302</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>305</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>367</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.HalfStoreFileReader.java">org/apache/hadoop/hbase/io/HalfStoreFileReader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 185 lines (max allowed is 150).</td>
 <td>97</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'atEnd' must be private and have accessor methods.</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>107</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>113</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>120</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>127</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>134</td></tr>
+<td>127</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>134</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>141</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.HeapSize.java">org/apache/hadoop/hbase/io/HeapSize.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -27738,37 +27707,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.ImmutableBytesWritable.java">org/apache/hadoop/hbase/io/ImmutableBytesWritable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>109</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -27777,175 +27746,175 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.Reference.java">org/apache/hadoop/hbase/io/Reference.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.fs.FSDataOutputStream' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>139</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>150</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>162</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>163</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>165</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>168</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>182</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>216</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>229</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>230</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>231</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>234</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>235</td></tr>
+<td>234</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>235</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>236</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.TagCompressionContext.java">org/apache/hadoop/hbase/io/TagCompressionContext.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>63</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>84</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>109</td></tr>
+<td>84</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>109</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>142</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.TestByteBufferOutputStream.java">org/apache/hadoop/hbase/io/TestByteBufferOutputStream.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -27954,31 +27923,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.TestFileLink.java">org/apache/hadoop/hbase/io/TestFileLink.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>281</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -27987,44 +27956,44 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.TestHFileLink.java">org/apache/hadoop/hbase/io/TestHFileLink.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>71</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>79</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>102</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>113</td></tr>
+<td>102</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>113</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
@@ -28032,19 +28001,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.TestHalfStoreFileReader.java">org/apache/hadoop/hbase/io/TestHalfStoreFileReader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -28053,25 +28022,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.TestHeapSize.java">org/apache/hadoop/hbase/io/TestHeapSize.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 177 lines (max allowed is 150).</td>
 <td>112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>295</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -28080,24 +28049,18 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.TestImmutableBytesWritable.java">org/apache/hadoop/hbase/io/TestImmutableBytesWritable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>54</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>54</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
@@ -28106,11 +28069,17 @@
 <td>54</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>54</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -28119,13 +28088,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.TestMetricsIO.java">org/apache/hadoop/hbase/io/TestMetricsIO.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -28134,19 +28103,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.TimeRange.java">org/apache/hadoop/hbase/io/TimeRange.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>184</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -28155,13 +28124,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.WALLink.java">org/apache/hadoop/hbase/io/WALLink.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -28170,13 +28139,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.asyncfs.AsyncFSOutput.java">org/apache/hadoop/hbase/io/asyncfs/AsyncFSOutput.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -28185,13 +28154,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper.java">org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -28200,25 +28169,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputSaslHelper.java">org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>359</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>372</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -28227,19 +28196,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.asyncfs.ProtobufDecoder.java">org/apache/hadoop/hbase/io/asyncfs/ProtobufDecoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -28248,56 +28217,56 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.compress.Compression.java">org/apache/hadoop/hbase/io/compress/Compression.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>357</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>372</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>381</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>381</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>397</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>400</td></tr>
+<td>397</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>400</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
@@ -28305,379 +28274,379 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.crypto.Cipher.java">org/apache/hadoop/hbase/io/crypto/Cipher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>90</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>101</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>112</td></tr>
+<td>101</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>112</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>123</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.crypto.Decryptor.java">org/apache/hadoop/hbase/io/crypto/Decryptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>33</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>51</td></tr>
+<td>33</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>51</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>57</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.crypto.Encryption.java">org/apache/hadoop/hbase/io/crypto/Encryption.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class Context should be declared as final.</td>
 <td>103</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>336</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>337</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>338</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>339</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>355</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>356</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>357</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>358</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>359</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>377</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>378</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>394</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>395</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>396</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>413</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>414</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>415</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>416</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>417</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>418</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>432</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>433</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>434</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>435</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>436</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>437</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>438</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>450</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>451</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>452</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>453</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>454</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>459</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>478</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>479</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>480</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>481</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>482</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>483</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>495</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>496</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>503</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>504</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 8.</td>
 <td>505</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>506</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>507</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 4, expected level should be 6.</td>
 <td>508</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>509</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 4, expected level should be 6.</td>
 <td>510</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>521</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -28686,58 +28655,58 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.crypto.Encryptor.java">org/apache/hadoop/hbase/io/crypto/Encryptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>33</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>56</td></tr>
+<td>33</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>56</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>62</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.crypto.KeyProvider.java">org/apache/hadoop/hbase/io/crypto/KeyProvider.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>44</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -28746,19 +28715,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.crypto.aes.CryptoAES.java">org/apache/hadoop/hbase/io/crypto/aes/CryptoAES.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>142</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -28767,13 +28736,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.encoding.CopyKeyDataBlockEncoder.java">org/apache/hadoop/hbase/io/encoding/CopyKeyDataBlockEncoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -28782,13 +28751,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.encoding.DataBlockEncoding.java">org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -28797,13 +28766,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder.java">org/apache/hadoop/hbase/io/encoding/DiffKeyDeltaEncoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -28812,40 +28781,40 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.encoding.EncodedDataBlock.java">org/apache/hadoop/hbase/io/encoding/EncodedDataBlock.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>73</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>74</td></tr>
+<td>73</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>74</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>182</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.encoding.FastDiffDeltaEncoder.java">org/apache/hadoop/hbase/io/encoding/FastDiffDeltaEncoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -28854,13 +28823,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder.java">org/apache/hadoop/hbase/io/encoding/PrefixKeyDeltaEncoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -28869,13 +28838,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.encoding.TestDataBlockEncoders.java">org/apache/hadoop/hbase/io/encoding/TestDataBlockEncoders.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -28884,13 +28853,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.encoding.TestEncodedSeekers.java">org/apache/hadoop/hbase/io/encoding/TestEncodedSeekers.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -28899,46 +28868,46 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hadoopbackport.ThrottledInputStream.java">org/apache/hadoop/hbase/io/hadoopbackport/ThrottledInputStream.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>101</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>102</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>103</td></tr>
+<td>102</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>103</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>104</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.BlockCache.java">org/apache/hadoop/hbase/io/hfile/BlockCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -28947,13 +28916,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.BlockCacheKey.java">org/apache/hadoop/hbase/io/hfile/BlockCacheKey.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -28962,61 +28931,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.BlockCacheUtil.java">org/apache/hadoop/hbase/io/hfile/BlockCacheUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>78</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>176</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>FileTabCharacter</td>
 <td>File contains tab characters (this is the first instance).</td>
 <td>188</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>295</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>299</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>320</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -29025,19 +28994,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.BlockCachesIterator.java">org/apache/hadoop/hbase/io/hfile/BlockCachesIterator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -29046,19 +29015,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.BlockType.java">org/apache/hadoop/hbase/io/hfile/BlockType.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>154</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -29067,13 +29036,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.CacheConfig.java">org/apache/hadoop/hbase/io/hfile/CacheConfig.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -29082,118 +29051,118 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.CacheStats.java">org/apache/hadoop/hbase/io/hfile/CacheStats.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>153</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>154</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>199</td></tr>
+<td>154</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>199</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>200</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.CacheTestUtils.java">org/apache/hadoop/hbase/io/hfile/CacheTestUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>226</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>228</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>229</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>231</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>233</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>234</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>235</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>235</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>236</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>237</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>238</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -29202,13 +29171,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.CacheableDeserializer.java">org/apache/hadoop/hbase/io/hfile/CacheableDeserializer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -29217,13 +29186,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.CacheableDeserializerIdManager.java">org/apache/hadoop/hbase/io/hfile/CacheableDeserializerIdManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -29232,19 +29201,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.ChecksumUtil.java">org/apache/hadoop/hbase/io/hfile/ChecksumUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ChecksumType' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -29253,13 +29222,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.CombinedBlockCache.java">org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -29268,19 +29237,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.CompoundBloomFilter.java">org/apache/hadoop/hbase/io/hfile/CompoundBloomFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.nio.ByteBuff' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -29289,19 +29258,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.CompoundBloomFilterBase.java">org/apache/hadoop/hbase/io/hfile/CompoundBloomFilterBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.BloomFilterBase' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -29310,19 +29279,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.CompoundBloomFilterWriter.java">org/apache/hadoop/hbase/io/hfile/CompoundBloomFilterWriter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValueUtil' import.</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -29331,13 +29300,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.CorruptHFileException.java">org/apache/hadoop/hbase/io/hfile/CorruptHFileException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -29346,19 +29315,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.FixedFileTrailer.java">org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>615</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -29367,229 +29336,229 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.HFileBlockIndex.java">org/apache/hadoop/hbase/io/hfile/HFileBlockIndex.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.HeapSize' import.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>68</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'class def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>399</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>FileTabCharacter</td>
 <td>File contains tab characters (this is the first instance).</td>
 <td>466</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>553</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>554</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>555</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>560</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>586</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>669</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>715</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>761</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>764</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>766</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>836</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>867</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>882</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1057</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1089</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1132</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1135</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1155</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1160</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1288</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1292</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1317</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>1363</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1518</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 7 should be on the previous line.</td>
 <td>1551</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1578</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1579</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>1595</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1627</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -29598,106 +29567,106 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.HFileDataBlockEncoder.java">org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>45</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>63</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>64</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>65</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>66</td></tr>
+<td>65</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>66</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>67</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.HFileInfo.java">org/apache/hadoop/hbase/io/hfile/HFileInfo.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 118).</td>
 <td>374</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -29706,67 +29675,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.HFilePrettyPrinter.java">org/apache/hadoop/hbase/io/hfile/HFilePrettyPrinter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>171</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>215</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>219</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>225</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>565</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>571</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>585</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>655</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class SimpleReporter should be declared as final.</td>
 <td>672</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -29775,145 +29744,145 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.HFileScanner.java">org/apache/hadoop/hbase/io/hfile/HFileScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.regionserver.Shipper' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>50</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>53</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>56</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>57</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>89</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>99</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>122</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -29922,38 +29891,38 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.HFileUtil.java">org/apache/hadoop/hbase/io/hfile/HFileUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>31</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>32</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>33</td></tr>
+<td>32</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>33</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
@@ -29961,13 +29930,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.HFileWriterImpl.java">org/apache/hadoop/hbase/io/hfile/HFileWriterImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -29976,25 +29945,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.KVGenerator.java">org/apache/hadoop/hbase/io/hfile/KVGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -30003,19 +29972,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.LruAdaptiveBlockCache.java">org/apache/hadoop/hbase/io/hfile/LruAdaptiveBlockCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.SortedSet.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -30024,25 +29993,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.LruCachedBlock.java">org/apache/hadoop/hbase/io/hfile/LruCachedBlock.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.HeapSize' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -30051,37 +30020,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.LruCachedBlockQueue.java">org/apache/hadoop/hbase/io/hfile/LruCachedBlockQueue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.HeapSize' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -30090,38 +30059,38 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.NanoTimer.java">org/apache/hadoop/hbase/io/hfile/NanoTimer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>73</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>119</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>121</td></tr>
+<td>119</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>121</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
@@ -30129,19 +30098,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.NoOpDataBlockEncoder.java">org/apache/hadoop/hbase/io/hfile/NoOpDataBlockEncoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.encoding.DataBlockEncoding' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -30150,19 +30119,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.PrefetchExecutor.java">org/apache/hadoop/hbase/io/hfile/PrefetchExecutor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -30171,85 +30140,85 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.RandomKeyValueUtil.java">org/apache/hadoop/hbase/io/hfile/RandomKeyValueUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Random' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>62</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -30258,19 +30227,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestCacheConfig.java">org/apache/hadoop/hbase/io/hfile/TestCacheConfig.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>166</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -30279,19 +30248,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestCacheOnWrite.java">org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>189</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -30300,13 +30269,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestCachedBlockQueue.java">org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -30315,31 +30284,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestChecksum.java">org/apache/hadoop/hbase/io/hfile/TestChecksum.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>67</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>90</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -30348,31 +30317,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestFixedFileTrailer.java">org/apache/hadoop/hbase/io/hfile/TestFixedFileTrailer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.testclassification.IOTests' import.</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>96</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>97</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -30381,19 +30350,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestForceCacheImportantBlocks.java">org/apache/hadoop/hbase/io/hfile/TestForceCacheImportantBlocks.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>130</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -30402,43 +30371,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestHFile.java">org/apache/hadoop/hbase/io/hfile/TestHFile.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>315</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>504</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 41 should have line break after.</td>
 <td>568</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>684</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>685</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -30447,37 +30416,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestHFileBlock.java">org/apache/hadoop/hbase/io/hfile/TestHFileBlock.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>177</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>358</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>374</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -30486,55 +30455,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestHFileBlockIndex.java">org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization lcurly' has incorrect indentation level 6, expected level should be one of the following: 2, 4.</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>354</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>364</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>382</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>525</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>586</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>676</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -30543,19 +30512,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestHFileDataBlockEncoder.java">org/apache/hadoop/hbase/io/hfile/TestHFileDataBlockEncoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>144</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -30564,25 +30533,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestHFileWriterV3.java">org/apache/hadoop/hbase/io/hfile/TestHFileWriterV3.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'&quot;testMidKeyInHFile&quot;' has incorrect indentation level 4, expected level should be 6.</td>
 <td>119</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 201 lines (max allowed is 150).</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -30591,49 +30560,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestLruAdaptiveBlockCache.java">org/apache/hadoop/hbase/io/hfile/TestLruAdaptiveBlockCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 12, expected level should be 10.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 14, expected level should be 12.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 14, expected level should be 12.</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 14, expected level should be 12.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rcurly' has incorrect indentation level 12, expected level should be 10.</td>
 <td>97</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -30642,25 +30611,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestLruBlockCache.java">org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 117).</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -30669,13 +30638,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestPrefetch.java">org/apache/hadoop/hbase/io/hfile/TestPrefetch.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -30684,13 +30653,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestScannerSelectionUsingKeyRange.java">org/apache/hadoop/hbase/io/hfile/TestScannerSelectionUsingKeyRange.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
@@ -30699,19 +30668,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TinyLfuBlockCache.java">org/apache/hadoop/hbase/io/hfile/TinyLfuBlockCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.github.benmanes.caffeine.cache.Cache' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -30720,193 +30689,193 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocator.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>56</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>72</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>132</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>139</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>140</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>142</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>164</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>207</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>209</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>216</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>217</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>247</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>248</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>275</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 54.</td>
 <td>276</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 54.</td>
 <td>277</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 54.</td>
 <td>278</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 54.</td>
 <td>279</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>286</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>287</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>313</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>340</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>415</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>437</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>438</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>453</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>462</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>571</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>576</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>578</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -30915,151 +30884,151 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 143).</td>
 <td>228</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>283</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 119).</td>
 <td>284</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 140).</td>
 <td>331</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 123).</td>
 <td>332</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 132).</td>
 <td>333</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>334</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 132).</td>
 <td>335</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 129).</td>
 <td>336</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 132).</td>
 <td>337</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>338</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>339</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>367</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>368</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>369</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>371</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>933</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1191</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>1195</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>1204</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>1289</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1423</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1489</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -31068,13 +31037,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.BucketCacheStats.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketCacheStats.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31083,13 +31052,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.BucketProtoUtils.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketProtoUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31098,19 +31067,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.ByteBufferIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/ByteBufferIOEngine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.Cacheable' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31119,13 +31088,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.CachedEntryQueue.java">org/apache/hadoop/hbase/io/hfile/bucket/CachedEntryQueue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31134,52 +31103,52 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.FileIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/FileIOEngine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>169</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>178</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>263</td></tr>
+<td>178</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>263</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>264</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.FileMmapIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/FileMmapIOEngine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31188,130 +31157,130 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.IOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/IOEngine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.Cacheable' import.</td>
 <td>25</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>62</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>70</td></tr>
+<td>62</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>70</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>76</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.TestBucketCache.java">org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMCache' import.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 8.</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 8.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 16, expected level should be one of the following: 14, 24.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 16, expected level should be one of the following: 14, 24.</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>188</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>407</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>473</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>494</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 137).</td>
 <td>504</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 130).</td>
 <td>513</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 156).</td>
 <td>522</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 157).</td>
 <td>524</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>529</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -31320,74 +31289,74 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.TestBucketWriterThread.java">org/apache/hadoop/hbase/io/hfile/bucket/TestBucketWriterThread.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>103</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>108</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>109</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>121</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>135</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>153</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>154</td></tr>
+<td>153</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>154</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
@@ -31395,13 +31364,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.TestFileIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/TestFileIOEngine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -31410,19 +31379,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.util.Dictionary.java">org/apache/hadoop/hbase/io/util/Dictionary.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31431,25 +31400,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.util.LRUDictionary.java">org/apache/hadoop/hbase/io/util/LRUDictionary.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>67</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>135</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -31458,55 +31427,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.util.MemorySizeUtil.java">org/apache/hadoop/hbase/io/util/MemorySizeUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.regionserver.MemStoreLAB' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>107</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>108</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>140</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>187</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31515,68 +31484,68 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.util.StreamUtils.java">org/apache/hadoop/hbase/io/util/StreamUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>64</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>68</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>72</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>98</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>102</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>106</td></tr>
+<td>102</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>106</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
@@ -31584,13 +31553,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.AbstractRpcClient.java">org/apache/hadoop/hbase/ipc/AbstractRpcClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -31599,13 +31568,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.AdaptiveLifoCoDelCallQueue.java">org/apache/hadoop/hbase/ipc/AdaptiveLifoCoDelCallQueue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31614,13 +31583,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.BlockingRpcCallback.java">org/apache/hadoop/hbase/ipc/BlockingRpcCallback.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31629,19 +31598,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.BlockingRpcConnection.java">org/apache/hadoop/hbase/ipc/BlockingRpcConnection.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>490</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -31650,25 +31619,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.BufferCallBeforeInitHandler.java">org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'action' must be private and have accessor methods.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
@@ -31677,19 +31646,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.BufferChain.java">org/apache/hadoop/hbase/ipc/BufferChain.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>51</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31698,19 +31667,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.CallQueueInfo.java">org/apache/hadoop/hbase/ipc/CallQueueInfo.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.HashMap' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -31719,19 +31688,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.CallRunner.java">org/apache/hadoop/hbase/ipc/CallRunner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.TimeoutIOException' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31740,58 +31709,58 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.CellBlockBuilder.java">org/apache/hadoop/hbase/ipc/CellBlockBuilder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.ByteArrayInputStream' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.codec.Codec' import.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>109</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>110</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>111</td></tr>
+<td>110</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>111</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>115</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.java">org/apache/hadoop/hbase/ipc/CoprocessorRpcUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -31800,13 +31769,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.DelegatingHBaseRpcController.java">org/apache/hadoop/hbase/ipc/DelegatingHBaseRpcController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31815,13 +31784,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.FailedServers.java">org/apache/hadoop/hbase/ipc/FailedServers.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31830,13 +31799,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.FifoRpcScheduler.java">org/apache/hadoop/hbase/ipc/FifoRpcScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31845,13 +31814,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.HBaseRpcController.java">org/apache/hadoop/hbase/ipc/HBaseRpcController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31860,13 +31829,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.HBaseRpcControllerImpl.java">org/apache/hadoop/hbase/ipc/HBaseRpcControllerImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31875,13 +31844,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.IPCUtil.java">org/apache/hadoop/hbase/ipc/IPCUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -31890,13 +31859,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.IntegrationTestRpcClient.java">org/apache/hadoop/hbase/ipc/IntegrationTestRpcClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31905,13 +31874,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.MasterFifoRpcScheduler.java">org/apache/hadoop/hbase/ipc/MasterFifoRpcScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31920,25 +31889,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.MetricsHBaseServer.java">org/apache/hadoop/hbase/ipc/MetricsHBaseServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 33 should have line break after.</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -31947,13 +31916,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.NettyRpcServerPreambleHandler.java">org/apache/hadoop/hbase/ipc/NettyRpcServerPreambleHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31962,13 +31931,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.NettyRpcServerRequestDecoder.java">org/apache/hadoop/hbase/ipc/NettyRpcServerRequestDecoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31977,13 +31946,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.NettyRpcServerResponseEncoder.java">org/apache/hadoop/hbase/ipc/NettyRpcServerResponseEncoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31992,19 +31961,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.NettyServerRpcConnection.java">org/apache/hadoop/hbase/ipc/NettyServerRpcConnection.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -32013,76 +31982,76 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.PriorityFunction.java">org/apache/hadoop/hbase/ipc/PriorityFunction.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.security.User' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>37</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>38</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>46</td></tr>
+<td>38</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>46</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>47</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RWQueueRpcExecutor.java">org/apache/hadoop/hbase/ipc/RWQueueRpcExecutor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.RegionAction' import.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -32091,19 +32060,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcCall.java">org/apache/hadoop/hbase/ipc/RpcCall.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32112,25 +32081,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcCallContext.java">org/apache/hadoop/hbase/ipc/RpcCallContext.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.security.User' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>37</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32139,13 +32108,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcClientFactory.java">org/apache/hadoop/hbase/ipc/RpcClientFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -32154,91 +32123,91 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcExecutor.java">org/apache/hadoop/hbase/ipc/RpcExecutor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Map' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.HashMap' import.</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler' import.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>57</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 37.</td>
 <td>154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>181</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>201</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>207</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32247,19 +32216,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcScheduler.java">org/apache/hadoop/hbase/ipc/RpcScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -32268,13 +32237,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcSchedulerContext.java">org/apache/hadoop/hbase/ipc/RpcSchedulerContext.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32283,68 +32252,68 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcServer.java">org/apache/hadoop/hbase/ipc/RpcServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.namequeues.RpcLogDetails' import.</td>
 <td>49</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.namequeues.NamedQueueRecorder' import.</td>
 <td>50</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>262</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>267</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>356</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>357</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>460</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>461</td></tr>
+<td>460</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>461</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
@@ -32352,37 +32321,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcServerFactory.java">org/apache/hadoop/hbase/ipc/RpcServerFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ReflectionUtils' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class RpcServerFactory should be declared as final.</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -32391,13 +32360,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcServerInterface.java">org/apache/hadoop/hbase/ipc/RpcServerInterface.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32406,133 +32375,133 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.ServerRpcConnection.java">org/apache/hadoop/hbase/ipc/ServerRpcConnection.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.VersionInfoUtil' import.</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>71</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>174</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>181</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>187</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>200</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>206</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>213</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>214</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>216</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>415</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>424</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>433</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>496</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>498</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>559</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>586</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>587</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>636</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -32541,32 +32510,32 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.java">org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.conf.ConfigurationObserver' import.</td>
 <td>26</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>56</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>60</td></tr>
+<td>56</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>60</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
@@ -32574,67 +32543,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.SimpleRpcServer.java">org/apache/hadoop/hbase/ipc/SimpleRpcServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>226</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>230</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>265</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>322</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>364</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>368</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>369</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 46 should have line break after.</td>
 <td>410</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>462</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -32643,37 +32612,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.SimpleRpcServerResponder.java">org/apache/hadoop/hbase/ipc/SimpleRpcServerResponder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Threads' import.</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>92</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>221</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32682,32 +32651,32 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.SimpleServerRpcConnection.java">org/apache/hadoop/hbase/ipc/SimpleServerRpcConnection.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.VersionInfoUtil' import.</td>
 <td>35</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>146</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>147</td></tr>
+<td>146</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>147</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
@@ -32715,13 +32684,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.TestBufferChain.java">org/apache/hadoop/hbase/ipc/TestBufferChain.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -32730,13 +32699,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.TestFifoRpcScheduler.java">org/apache/hadoop/hbase/ipc/TestFifoRpcScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -32745,13 +32714,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.TestIPCUtil.java">org/apache/hadoop/hbase/ipc/TestIPCUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -32760,82 +32729,82 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.TestRpcMetrics.java">org/apache/hadoop/hbase/ipc/TestRpcMetrics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>47</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>50</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>69</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
 <td>156</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
 <td>157</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
-<td>160</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
-<td>161</td></tr>
+<td>160</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
+<td>161</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
 <td>162</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.log.HBaseMarkers.java">org/apache/hadoop/hbase/log/HBaseMarkers.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -32844,31 +32813,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.Driver.java">org/apache/hadoop/hbase/mapred/Driver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.util.ProgramDriver' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32877,112 +32846,112 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.GroupingTableMap.java">org/apache/hadoop/hbase/mapred/GroupingTableMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>90</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>91</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>92</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>111</td></tr>
+<td>92</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>111</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>140</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.HRegionPartitioner.java">org/apache/hadoop/hbase/mapred/HRegionPartitioner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>41</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>45</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -32991,139 +32960,139 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.IdentityTableMap.java">org/apache/hadoop/hbase/mapred/IdentityTableMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.ImmutableBytesWritable' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>37</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>64</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>65</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>66</td></tr>
+<td>65</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>66</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>67</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.IdentityTableReduce.java">org/apache/hadoop/hbase/mapred/IdentityTableReduce.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Put' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>46</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>47</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>48</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>49</td></tr>
+<td>48</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>49</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>50</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.MultiTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -33132,70 +33101,70 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.RowCounter.java">org/apache/hadoop/hbase/mapred/RowCounter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configured' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 2, expected level should be 4.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>57</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>59</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>72</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>74</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>114</td></tr>
+<td>74</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>114</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>115</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableInputFormat.java">org/apache/hadoop/hbase/mapred/TableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -33204,50 +33173,50 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableInputFormatBase.java">org/apache/hadoop/hbase/mapred/TableInputFormatBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>230</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>272</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>300</td></tr>
+<td>272</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>300</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 21 should have line break after.</td>
@@ -33255,19 +33224,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableMap.java">org/apache/hadoop/hbase/mapred/TableMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -33276,104 +33245,104 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableMapReduceUtil.java">org/apache/hadoop/hbase/mapred/TableMapReduceUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>47</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>172</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>176</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>177</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>203</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>207</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>208</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>241</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>253</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>258</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>270</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>387</td></tr>
+<td>270</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>387</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
@@ -33381,31 +33350,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableOutputFormat.java">org/apache/hadoop/hbase/mapred/TableOutputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.BufferedMutator' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>108</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -33414,50 +33383,50 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableRecordReader.java">org/apache/hadoop/hbase/mapred/TableRecordReader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>44</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>53</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>133</td></tr>
+<td>53</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>133</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
@@ -33465,19 +33434,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableReduce.java">org/apache/hadoop/hbase/mapred/TableReduce.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Put' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -33486,49 +33455,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapred/TableSnapshotInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'getRecordReader' has incorrect indentation level 2, expected level should be 4.</td>
 <td>149</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>158</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>159</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>172</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>173</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -33537,163 +33506,163 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableSplit.java">org/apache/hadoop/hbase/mapred/TableSplit.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>50</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>51</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>119</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>120</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>121</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>122</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>123</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>124</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>125</td></tr>
+<td>124</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>125</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>126</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TestGroupingTableMap.java">org/apache/hadoop/hbase/mapred/TestGroupingTableMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>88</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>123</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>176</td></tr>
+<td>123</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>176</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>189</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TestIdentityTableMap.java">org/apache/hadoop/hbase/mapred/TestIdentityTableMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>57</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -33702,79 +33671,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TestRowCounter.java">org/apache/hadoop/hbase/mapred/TestRowCounter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
 <td>105</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>150</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>152</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>153</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>155</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>156</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>157</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>158</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -33783,118 +33752,118 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TestTableInputFormat.java">org/apache/hadoop/hbase/mapred/TestTableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>124</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>165</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>166</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>196</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>231</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>268</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>279</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>290</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>301</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>312</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>386</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
-<td>389</td></tr>
+<td>386</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
+<td>389</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
 <td>392</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TestTableMapReduce.java">org/apache/hadoop/hbase/mapred/TestTableMapReduce.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 29 should have line break after.</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -33903,70 +33872,70 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TestTableMapReduceUtil.java">org/apache/hadoop/hbase/mapred/TestTableMapReduceUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>188</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>211</td></tr>
+<td>188</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>211</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>226</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.CellCounter.java">org/apache/hadoop/hbase/mapreduce/CellCounter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>89</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>190</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>247</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>259</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -33975,58 +33944,58 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.CellCreator.java">org/apache/hadoop/hbase/mapreduce/CellCreator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>64</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>89</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>119</td></tr>
+<td>89</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>119</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>121</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.CellSerialization.java">org/apache/hadoop/hbase/mapreduce/CellSerialization.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -34035,19 +34004,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.CellSortReducer.java">org/apache/hadoop/hbase/mapreduce/CellSortReducer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -34056,73 +34025,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.CopyTable.java">org/apache/hadoop/hbase/mapreduce/CopyTable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>156</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>158</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>159</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>162</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>229</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>231</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>232</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>240</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>243</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -34131,25 +34100,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.DefaultVisibilityExpressionResolver.java">org/apache/hadoop/hbase/mapreduce/DefaultVisibilityExpressionResolver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>101</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -34158,13 +34127,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.Driver.java">org/apache/hadoop/hbase/mapreduce/Driver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -34173,25 +34142,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.Export.java">org/apache/hadoop/hbase/mapreduce/Export.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HBaseConfiguration' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>59</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -34200,43 +34169,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.ExportUtils.java">org/apache/hadoop/hbase/mapreduce/ExportUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>68</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>72</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>86</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>105</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -34245,31 +34214,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.GroupingTableMapper.java">org/apache/hadoop/hbase/mapreduce/GroupingTableMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -34278,13 +34247,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.HFileInputFormat.java">org/apache/hadoop/hbase/mapreduce/HFileInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -34293,13 +34262,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.java">org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -34308,31 +34277,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.HRegionPartitioner.java">org/apache/hadoop/hbase/mapreduce/HRegionPartitioner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -34341,13 +34310,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.HashTable.java">org/apache/hadoop/hbase/mapreduce/HashTable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -34356,25 +34325,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.IdentityTableMapper.java">org/apache/hadoop/hbase/mapreduce/IdentityTableMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>34</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -34383,25 +34352,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.IdentityTableReducer.java">org/apache/hadoop/hbase/mapreduce/IdentityTableReducer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Mutation' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -34410,97 +34379,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.Import.java">org/apache/hadoop/hbase/mapreduce/Import.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
 <td>45</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>187</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>209</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>220</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>274</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>286</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>321</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>331</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>350</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>430</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>545</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>549</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>567</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -34509,128 +34478,128 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.ImportTsv.java">org/apache/hadoop/hbase/mapreduce/ImportTsv.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>155</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>249</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>398</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>400</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>423</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>424</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>426</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>590</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>630</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>657</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>659</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>676</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>690</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>693</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>694</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>728</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>738</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>749</td></tr>
+<td>738</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>749</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
@@ -34638,112 +34607,112 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.IntegrationTestBulkLoad.java">org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>207</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>252</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 29 should have line break after.</td>
 <td>315</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 36 should have line break after.</td>
 <td>317</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'InterruptedException' has incorrect indentation level 4, expected level should be 6.</td>
 <td>331</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>370</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 123).</td>
 <td>377</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>672</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>687</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>688</td></tr>
+<td>687</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>688</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>689</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.IntegrationTestImportTsv.java">org/apache/hadoop/hbase/mapreduce/IntegrationTestImportTsv.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>152</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>153</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>154</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>173</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -34752,19 +34721,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.IntegrationTestTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/IntegrationTestTableSnapshotInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -34773,13 +34742,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MapreduceTestingShim.java">org/apache/hadoop/hbase/mapreduce/MapreduceTestingShim.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -34788,25 +34757,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableHFileOutputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableHFileOutputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.TableDescriptor' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -34815,13 +34784,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -34830,13 +34799,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -34845,58 +34814,58 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableInputFormatTestBase.java">org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatTestBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>160</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>217</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>218</td></tr>
+<td>217</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>218</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>219</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableOutputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableOutputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Durability' import.</td>
 <td>37</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -34905,25 +34874,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -34932,106 +34901,106 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultiTableSnapshotInputFormatImpl.java">org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormatImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>122</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>148</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>149</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>150</td></tr>
+<td>149</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>150</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>177</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MultithreadedTableMapper.java">org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'Class' has incorrect indentation level 2, expected level should be 4.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'void' has incorrect indentation level 2, expected level should be 4.</td>
 <td>112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>147</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rparen' has incorrect indentation level 8, expected level should be 4.</td>
 <td>164</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'InterruptedException' has incorrect indentation level 4, expected level should be 6.</td>
 <td>195</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'InterruptedException' has incorrect indentation level 4, expected level should be 6.</td>
 <td>200</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>266</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -35040,19 +35009,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.MutationSerialization.java">org/apache/hadoop/hbase/mapreduce/MutationSerialization.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Delete' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -35061,25 +35030,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.PutCombiner.java">org/apache/hadoop/hbase/mapreduce/PutCombiner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Map' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -35088,25 +35057,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.PutSortReducer.java">org/apache/hadoop/hbase/mapreduce/PutSortReducer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Put' import.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>74</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -35115,25 +35084,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.ResultSerialization.java">org/apache/hadoop/hbase/mapreduce/ResultSerialization.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -35142,64 +35111,64 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.RoundRobinTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>annotation</td>
-<td>MissingDeprecated</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 14 has parse error. Details: mismatched input ':' expecting &lt;EOF&gt; while parsing JAVADOC</td>
 <td>46</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.RowCounter.java">org/apache/hadoop/hbase/mapreduce/RowCounter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.ArrayList' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>38</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>98</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>261</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -35208,31 +35177,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.SimpleTotalOrderPartitioner.java">org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>49</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -35241,70 +35210,70 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.SyncTable.java">org/apache/hadoop/hbase/mapreduce/SyncTable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>244</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>245</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>247</td></tr>
+<td>245</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>247</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 5, expected level should be 4.</td>
 <td>637</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Pair' import.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>49</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>130</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -35313,97 +35282,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>103</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>121</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>439</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>461</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>475</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>534</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 127).</td>
 <td>536</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 135).</td>
 <td>537</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 150).</td>
 <td>542</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>589</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>614</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>659</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -35412,385 +35381,385 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.java">org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.security.User' import.</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.codahale.metrics.MetricRegistry' import.</td>
 <td>65</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>109</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>137</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>140</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 5.</td>
 <td>144</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>145</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>159</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>164</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 3, expected level should be 5.</td>
 <td>169</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>170</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
 <td>172</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>185</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>198</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>200</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>201</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>231</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>242</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>243</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>257</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>267</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>268</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>291</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>301</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>302</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>397</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>402</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>403</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>639</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>651</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>667</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>669</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>671</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>672</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>673</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>674</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>675</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>676</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>677</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>699</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>701</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>703</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>704</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>705</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>706</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>707</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>708</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>709</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>726</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>793</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>853</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>854</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>930</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>945</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>961</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>965</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>987</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1001</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -35799,19 +35768,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableMapper.java">org/apache/hadoop/hbase/mapreduce/TableMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -35820,25 +35789,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableOutputCommitter.java">org/apache/hadoop/hbase/mapreduce/TableOutputCommitter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.mapreduce.JobContext' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>64</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -35847,37 +35816,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableOutputFormat.java">org/apache/hadoop/hbase/mapreduce/TableOutputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 127).</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>139</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -35886,25 +35855,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableRecordReader.java">org/apache/hadoop/hbase/mapreduce/TableRecordReader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>38</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -35913,115 +35882,115 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl.java">org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 6, expected level should be 4.</td>
 <td>309</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>310</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 6.</td>
 <td>311</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>312</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 6.</td>
 <td>313</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>314</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 4.</td>
 <td>315</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>316</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 6.</td>
 <td>317</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>318</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 6.</td>
 <td>319</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>320</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 4.</td>
 <td>321</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>322</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 6.</td>
 <td>323</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>324</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 6.</td>
 <td>325</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -36030,19 +35999,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableReducer.java">org/apache/hadoop/hbase/mapreduce/TableReducer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Mutation' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -36051,61 +36020,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>203</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>216</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>217</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>222</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>223</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>224</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -36114,13 +36083,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormatImpl.java">org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -36129,13 +36098,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestGroupingTableMapper.java">org/apache/hadoop/hbase/mapreduce/TestGroupingTableMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -36144,31 +36113,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestHBaseMRTestingUtility.java">org/apache/hadoop/hbase/mapreduce/TestHBaseMRTestingUtility.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.junit.Assert.assertFalse' import.</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -36177,241 +36146,241 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestHFileOutputFormat2.java">org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 5 should be on the previous line.</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>205</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>273</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>274</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>296</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>325</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>358</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>364</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>432</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>546</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>624</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>633</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 170 lines (max allowed is 150).</td>
 <td>636</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>797</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>799</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>808</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>844</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>856</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>897</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>921</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'getMockColumnFamiliesForBloomType' has incorrect indentation level 2, expected level should be 4.</td>
 <td>973</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>973</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>994</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>1007</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rparen' has incorrect indentation level 10, expected level should be 6.</td>
 <td>1019</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'getMockColumnFamiliesForBlockSize' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1048</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>1048</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1073</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>1087</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>1127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1149</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1229</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>1249</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>1251</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>1451</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>1455</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>1504</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -36420,13 +36389,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestHRegionPartitioner.java">org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -36435,305 +36404,305 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestImportExport.java">org/apache/hadoop/hbase/mapreduce/TestImportExport.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>176</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>178</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>180</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>194</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>196</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>197</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>198</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>277</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 14, expected level should be 8.</td>
 <td>296</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 14, expected level should be 8.</td>
 <td>297</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>308</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>315</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>334</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>334</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>336</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>372</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>374</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>375</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>390</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>391</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>446</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>447</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>448</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>464</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>465</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
 <td>533</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
 <td>534</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
 <td>535</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
 <td>549</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
 <td>550</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>562</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>626</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 123).</td>
 <td>644</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>711</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>713</td></tr>
+<td>711</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>713</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 14, expected level should be one of the following: 12, 25.</td>
 <td>774</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestImportTSVWithOperationAttributes.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>129</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>131</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>132</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>145</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>147</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>148</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>163</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>203</td></tr>
+<td>163</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>203</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
@@ -36741,196 +36710,196 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestImportTSVWithTTLs.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>117</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>119</td></tr>
+<td>117</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>119</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>120</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestImportTSVWithVisibilityLabels.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithVisibilityLabels.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>168</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>170</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>171</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>184</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>185</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>186</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>236</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>237</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>239</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>254</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>256</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>258</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>259</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization rcurly' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>261</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>273</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>275</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>276</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>277</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>291</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>292</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>309</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>311</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>312</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>313</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>384</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>386</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -36939,127 +36908,127 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestImportTsv.java">org/apache/hadoop/hbase/mapreduce/TestImportTsv.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>147</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>197</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>199</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>201</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization rcurly' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>205</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 14, expected level should be one of the following: 10, 12.</td>
 <td>243</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 16, expected level should be one of the following: 12, 14.</td>
 <td>244</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 16, expected level should be one of the following: 12, 14.</td>
 <td>245</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 14, expected level should be one of the following: 10, 12.</td>
 <td>246</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>247</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>273</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>274</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>275</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>276</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>278</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>403</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>490</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -37068,19 +37037,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestMultiTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be 2.</td>
 <td>47</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -37089,31 +37058,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestMultiTableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormatBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 6, expected level should be 8.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>128</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -37122,80 +37091,80 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestMultithreadedTableMapper.java">org/apache/hadoop/hbase/mapreduce/TestMultithreadedTableMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 76.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>96</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>101</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>102</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>103</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>104</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'cf' has incorrect indentation level 6, expected level should be 8.</td>
 <td>114</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>132</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>133</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>134</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>206</td></tr>
+<td>134</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>206</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
@@ -37203,13 +37172,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestRoundRobinTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TestRoundRobinTableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -37218,265 +37187,265 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestRowCounter.java">org/apache/hadoop/hbase/mapreduce/TestRowCounter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>71</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>134</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>149</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>161</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>173</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>197</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>210</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>237</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>250</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>298</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>534</td></tr>
+<td>298</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>534</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>535</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TestTableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>111</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>122</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>124</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>163</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>164</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>165</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>237</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>274</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>275</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>287</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>288</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>300</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>301</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>313</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>314</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>326</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>327</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>400</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
-<td>403</td></tr>
+<td>400</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
+<td>403</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
 <td>406</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestTableInputFormatScanBase.java">org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScanBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -37485,55 +37454,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestTableMapReduce.java">org/apache/hadoop/hbase/mapreduce/TestTableMapReduce.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 29 should have line break after.</td>
 <td>69</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>87</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>149</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -37542,37 +37511,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestTableMapReduceBase.java">org/apache/hadoop/hbase/mapreduce/TestTableMapReduceBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 76.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>92</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>163</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>176</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -37581,31 +37550,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestTimeRangeMapRed.java">org/apache/hadoop/hbase/mapreduce/TestTimeRangeMapRed.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 2, expected level should be 4.</td>
 <td>111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>119</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -37614,49 +37583,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TextSortReducer.java">org/apache/hadoop/hbase/mapreduce/TextSortReducer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.ImmutableBytesWritable' import.</td>
 <td>37</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>98</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>114</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>141</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>173</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -37665,37 +37634,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TsvImporterMapper.java">org/apache/hadoop/hbase/mapreduce/TsvImporterMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Put' import.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>121</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>153</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -37704,37 +37673,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper.java">org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.ImmutableBytesWritable' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.mapreduce.Counter' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -37743,13 +37712,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.VisibilityExpressionResolver.java">org/apache/hadoop/hbase/mapreduce/VisibilityExpressionResolver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -37758,55 +37727,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication.java">org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>273</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 14, expected level should be 16.</td>
 <td>274</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>387</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 164 lines (max allowed is 150).</td>
 <td>518</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>671</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>712</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 119).</td>
 <td>729</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -37815,13 +37784,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.AbstractTestDLS.java">org/apache/hadoop/hbase/master/AbstractTestDLS.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -37830,55 +37799,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.AssignmentVerificationReport.java">org/apache/hadoop/hbase/master/AssignmentVerificationReport.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 219 lines (max allowed is 150).</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>311</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>312</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>313</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>435</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>436</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>452</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -37887,43 +37856,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.ClusterSchema.java">org/apache/hadoop/hbase/master/ClusterSchema.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.NonceKey' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>87</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>97</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -37932,31 +37901,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.ClusterSchemaServiceImpl.java">org/apache/hadoop/hbase/master/ClusterSchemaServiceImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>90</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -37965,19 +37934,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.ClusterStatusPublisher.java">org/apache/hadoop/hbase/master/ClusterStatusPublisher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -37986,19 +37955,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.DrainingServerTracker.java">org/apache/hadoop/hbase/master/DrainingServerTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Abortable' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -38007,547 +37976,547 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.HMaster.java">org/apache/hadoop/hbase/master/HMaster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>582</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>736</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 317 lines (max allowed is 150).</td>
 <td>795</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>1363</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>1470</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1641</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1696</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1890</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1901</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1903</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1904</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1907</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1908</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1910</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1912</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1913</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1914</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>1942</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>1944</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2153</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2155</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2157</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2163</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2164</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2166</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2168</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2169</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2171</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2173</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2174</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2175</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2188</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2190</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2192</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2193</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2194</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2196</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2198</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2199</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2201</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2203</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2204</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2205</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2288</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2290</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2296</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2297</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>2298</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 16, expected level should be one of the following: 18, 20.</td>
 <td>2305</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 14, expected level should be one of the following: 16, 18.</td>
 <td>2307</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
 <td>2308</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>2309</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
 <td>2310</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>2311</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2312</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2314</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2321</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2322</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2324</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2326</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2327</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2329</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2331</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2332</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2333</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2343</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2345</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2347</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2357</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2358</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2360</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2362</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2363</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2365</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2367</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2368</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2369</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2432</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2436</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2438</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>2440</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>2441</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>2442</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2876</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>3052</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>3054</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>3166</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>3196</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>3208</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -38556,55 +38525,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.HMasterCommandLine.java">org/apache/hadoop/hbase/master/HMasterCommandLine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>89</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>158</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 14, expected level should be 12.</td>
 <td>194</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 14, expected level should be 12.</td>
 <td>195</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>260</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -38613,13 +38582,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.HbckChore.java">org/apache/hadoop/hbase/master/HbckChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -38628,148 +38597,148 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.MasterCoprocessorHost.java">org/apache/hadoop/hbase/master/MasterCoprocessorHost.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>777</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>795</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>814</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>830</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>831</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>833</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>850</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>864</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>879</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>896</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>915</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>934</td></tr>
+<td>915</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>934</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>952</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.MasterFileSystem.java">org/apache/hadoop/hbase/master/MasterFileSystem.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>131</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>132</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>133</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>134</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>329</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>330</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>352</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -38778,286 +38747,286 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.MasterRpcServices.java">org/apache/hadoop/hbase/master/MasterRpcServices.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure.</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1109</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1138</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1177</td></tr>
+<td>1138</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>1177</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>1813</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.MasterServices.java">org/apache/hadoop/hbase/master/MasterServices.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>153</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>154</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>155</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>165</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>187</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>198</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>199</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>200</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>213</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>214</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>226</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>227</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>228</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>238</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>239</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>240</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>252</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>253</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>254</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>267</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>268</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>269</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>282</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>283</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>284</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>300</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>315</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>369</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>377</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>384</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>392</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>400</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>407</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>408</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>413</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>415</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -39066,25 +39035,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.MasterStatusServlet.java">org/apache/hadoop/hbase/master/MasterStatusServlet.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -39093,13 +39062,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.MasterWalManager.java">org/apache/hadoop/hbase/master/MasterWalManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -39108,64 +39077,64 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.MetricsAssignmentManager.java">org/apache/hadoop/hbase/master/MetricsAssignmentManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>60</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>69</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>77</td></tr>
+<td>69</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>77</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>85</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.MetricsMaster.java">org/apache/hadoop/hbase/master/MetricsMaster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 117).</td>
 <td>49</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -39174,25 +39143,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.MetricsMasterWrapperImpl.java">org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.quotas.QuotaObserverChore' import.</td>
 <td>34</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>151</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -39201,55 +39170,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.MockRegionServer.java">org/apache/hadoop/hbase/master/MockRegionServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>75</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>201</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>205</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>231</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>232</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>263</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -39258,13 +39227,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.RackManager.java">org/apache/hadoop/hbase/master/RackManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -39273,157 +39242,157 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.RegionPlacementMaintainer.java">org/apache/hadoop/hbase/master/RegionPlacementMaintainer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>114</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>130</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>181</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>182</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>183</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>186</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>187</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>188</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 257 lines (max allowed is 150).</td>
 <td>190</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>468</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>484</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>610</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>613</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>622</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>634</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>655</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>656</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>659</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>717</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>781</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>834</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>937</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 164 lines (max allowed is 150).</td>
 <td>947</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -39432,19 +39401,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.RegionServerTracker.java">org/apache/hadoop/hbase/master/RegionServerTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -39453,19 +39422,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.RegionState.java">org/apache/hadoop/hbase/master/RegionState.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>406</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -39474,13 +39443,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.ServerListener.java">org/apache/hadoop/hbase/master/ServerListener.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -39489,97 +39458,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.ServerManager.java">org/apache/hadoop/hbase/master/ServerManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.ServerMetricsBuilder.</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>214</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>236</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>237</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>355</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>451</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>546</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>555</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>594</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>661</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>762</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>791</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>804</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>805</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -39588,106 +39557,106 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.SnapshotOfRegionAssignmentFromMeta.java">org/apache/hadoop/hbase/master/SnapshotOfRegionAssignmentFromMeta.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>103</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>113</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>115</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>117</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>118</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>130</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>139</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>156</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>157</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>158</td></tr>
+<td>157</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>158</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>194</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.SnapshotSentinel.java">org/apache/hadoop/hbase/master/SnapshotSentinel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.errorhandling.ForeignException' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -39696,103 +39665,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.SplitLogManager.java">org/apache/hadoop/hbase/master/SplitLogManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>117</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>191</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>391</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>392</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'installed' must be private and have accessor methods.</td>
 <td>493</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'done' must be private and have accessor methods.</td>
 <td>494</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'error' must be private and have accessor methods.</td>
 <td>495</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'isDead' must be private and have accessor methods.</td>
 <td>496</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'last_update' must be private and have accessor methods.</td>
 <td>509</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'last_version' must be private and have accessor methods.</td>
 <td>510</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'cur_worker_name' must be private and have accessor methods.</td>
 <td>511</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'batch' must be private and have accessor methods.</td>
 <td>512</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'status' must be private and have accessor methods.</td>
 <td>513</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'incarnation' must be private and have accessor methods.</td>
 <td>514</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'unforcedResubmits' must be private and have accessor methods.</td>
 <td>515</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
@@ -39801,25 +39770,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.SplitOrMergeTracker.java">org/apache/hadoop/hbase/master/SplitOrMergeTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.zookeeper.ZKWatcher' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.MasterSwitchType' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -39828,13 +39797,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestActiveMasterManager.java">org/apache/hadoop/hbase/master/TestActiveMasterManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -39843,19 +39812,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestDeadServer.java">org/apache/hadoop/hbase/master/TestDeadServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.io.IOException.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -39864,13 +39833,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestHMasterCommandLine.java">org/apache/hadoop/hbase/master/TestHMasterCommandLine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -39879,52 +39848,52 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestMasterFailoverBalancerPersistence.java">org/apache/hadoop/hbase/master/TestMasterFailoverBalancerPersistence.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>49</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>90</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>92</td></tr>
+<td>90</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>92</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>93</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestMasterMetricsWrapper.java">org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -39933,61 +39902,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestMasterNoCluster.java">org/apache/hadoop/hbase/master/TestMasterNoCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>89</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 10, 12.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 12, 14.</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 10, 12.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 10, 12.</td>
 <td>98</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 12, 14.</td>
 <td>100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 10, 12.</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 8, 10.</td>
 <td>102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -39996,13 +39965,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestMasterOperationsForRegionReplicas.java">org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -40011,13 +39980,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestMasterStatusServlet.java">org/apache/hadoop/hbase/master/TestMasterStatusServlet.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -40026,43 +39995,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestMasterTransitions.java">org/apache/hadoop/hbase/master/TestMasterTransitions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>67</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>203</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>259</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>387</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>500</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -40071,109 +40040,109 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestRegionPlacement.java">org/apache/hadoop/hbase/master/TestRegionPlacement.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>166</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>167</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'report' has incorrect indentation level 4, expected level should be 6.</td>
 <td>181</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>187</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>338</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>339</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>340</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>341</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>342</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>346</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>367</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>407</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>420</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>421</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>472</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>535</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -40182,19 +40151,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestRegionPlacement2.java">org/apache/hadoop/hbase/master/TestRegionPlacement2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>95</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -40203,13 +40172,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestSplitWALManager.java">org/apache/hadoop/hbase/master/TestSplitWALManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -40218,121 +40187,121 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.TestWarmupRegion.java">org/apache/hadoop/hbase/master/TestWarmupRegion.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>86</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>158</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>161</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>162</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>163</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 5, expected level should be 4.</td>
 <td>164</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>165</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>166</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>167</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>168</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>168</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>169</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>170</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>171</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -40341,19 +40310,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.AssignProcedure.java">org/apache/hadoop/hbase/master/assignment/AssignProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>34</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -40362,13 +40331,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.AssignmentManagerUtil.java">org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -40377,19 +40346,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.GCMergedRegionsProcedure.java">org/apache/hadoop/hbase/master/assignment/GCMergedRegionsProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>47</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -40398,13 +40367,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.GCMultipleMergedRegionsProcedure.java">org/apache/hadoop/hbase/master/assignment/GCMultipleMergedRegionsProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -40413,13 +40382,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.GCRegionProcedure.java">org/apache/hadoop/hbase/master/assignment/GCRegionProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -40428,76 +40397,76 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.RegionStateStore.java">org/apache/hadoop/hbase/master/assignment/RegionStateStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>148</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>151</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>155</td></tr>
+<td>151</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>155</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>158</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.RegionStates.java">org/apache/hadoop/hbase/master/assignment/RegionStates.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>163</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>175</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>184</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>193</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>385</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -40506,13 +40475,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.RegionTransitionProcedure.java">org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -40521,13 +40490,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.TestAssignmentOnRSCrash.java">org/apache/hadoop/hbase/master/assignment/TestAssignmentOnRSCrash.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -40536,13 +40505,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.TestRegionSplitAndSeparateChildren.java">org/apache/hadoop/hbase/master/assignment/TestRegionSplitAndSeparateChildren.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -40551,19 +40520,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.TestRegionStates.java">org/apache/hadoop/hbase/master/assignment/TestRegionStates.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.junit.After' import.</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -40572,19 +40541,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.TestSplitTableRegionProcedure.java">org/apache/hadoop/hbase/master/assignment/TestSplitTableRegionProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 0, expected level should be 2.</td>
 <td>172</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -40593,13 +40562,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.BalancerChore.java">org/apache/hadoop/hbase/master/balancer/BalancerChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -40608,439 +40577,439 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.BalancerTestBase.java">org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>80</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>87</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>90</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 45.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>97</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>98</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>99</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>104</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>105</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>107</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>108</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>109</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>110</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>111</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>115</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>117</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>118</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>120</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>121</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>122</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>124</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>125</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>129</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>131</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>133</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>134</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>136</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>137</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>139</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>140</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>141</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>142</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>143</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>144</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>145</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>146</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>147</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>148</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>149</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>150</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>151</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>152</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>153</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>253</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>336</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>337</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>370</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>384</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 150).</td>
 <td>408</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>429</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -41049,362 +41018,362 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>137</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>155</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>156</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>157</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 261 lines (max allowed is 150).</td>
 <td>202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>313</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'type' must be private and have accessor methods.</td>
 <td>639</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>640</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 33 should have line break after.</td>
 <td>640</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 34 should have line break after.</td>
 <td>642</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 32 should have line break after.</td>
 <td>644</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'region' must be private and have accessor methods.</td>
 <td>648</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'server' must be private and have accessor methods.</td>
 <td>649</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'region' must be private and have accessor methods.</td>
 <td>668</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'fromServer' must be private and have accessor methods.</td>
 <td>669</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'toServer' must be private and have accessor methods.</td>
 <td>670</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>680</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'fromServer' must be private and have accessor methods.</td>
 <td>689</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'fromRegion' must be private and have accessor methods.</td>
 <td>690</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'toServer' must be private and have accessor methods.</td>
 <td>691</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'toRegion' must be private and have accessor methods.</td>
 <td>692</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>702</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>716</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>717</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>720</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>721</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>722</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>723</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>724</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>726</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>727</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>727</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>728</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>729</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>730</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>731</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>733</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>734</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>734</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>735</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>735</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>736</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>737</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>738</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>739</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>740</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>751</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>863</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>878</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1050</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1051</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1053</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1054</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1094</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1123</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1125</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1215</td></tr>
+<td>1125</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1215</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
@@ -41412,13 +41381,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.ClusterLoadState.java">org/apache/hadoop/hbase/master/balancer/ClusterLoadState.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -41427,13 +41396,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.ClusterStatusChore.java">org/apache/hadoop/hbase/master/balancer/ClusterStatusChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -41442,19 +41411,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.FavoredStochasticBalancer.java">org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'segregateRegionsAndAssignRegionsWithFavoredNodes' has incorrect indentation level 2, expected level should be 4.</td>
 <td>205</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -41463,13 +41432,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory.java">org/apache/hadoop/hbase/master/balancer/LoadBalancerFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -41478,49 +41447,34 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.LoadBalancerPerformanceEvaluation.java">org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>90</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.master.balancer.LocalityBasedCandidateGenerator.java">org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
-<td>25</td></tr></table></div>
-<div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.RegionInfoComparator.java">org/apache/hadoop/hbase/master/balancer/RegionInfoComparator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>34</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -41529,13 +41483,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.ServerAndLoad.java">org/apache/hadoop/hbase/master/balancer/ServerAndLoad.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -41544,181 +41498,181 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.SimpleLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>143</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 208 lines (max allowed is 150).</td>
 <td>255</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>326</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>330</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>345</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>364</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>367</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>376</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>397</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>399</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>418</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>449</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>467</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>472</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>473</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>473</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>475</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>513</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 120).</td>
 <td>514</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>515</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>527</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>528</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>544</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>551</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>572</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>573</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>579</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>596</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -41727,59 +41681,65 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>308</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>321</td></tr>
+<td>307</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>323</td></tr>
+<td>528</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>531</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>662</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>789</td></tr>
+<td>659</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>790</td></tr>
+<td>786</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>787</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>788</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>789</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>790</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>791</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -41797,13 +41757,13 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>794</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>795</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -41821,7 +41781,7 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>798</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -41833,7 +41793,7 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>800</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -41843,62 +41803,44 @@
 <td>801</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>802</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>803</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>804</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>877</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>1097</td></tr>
+<td>874</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
-<td>1098</td></tr>
+<td>1094</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 109).</td>
-<td>1099</td></tr>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>1095</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
-<td>1136</td></tr></table></div>
+<td>1096</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 109).</td>
+<td>1133</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.TestBalancerStatusTagInJMXMetrics.java">org/apache/hadoop/hbase/master/balancer/TestBalancerStatusTagInJMXMetrics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -41907,103 +41849,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.TestBaseLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>87</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>135</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>136</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>151</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>192</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>257</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>338</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>433</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>434</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>435</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>445</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -42012,85 +41954,85 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.TestRegionsOnMasterOptions.java">org/apache/hadoop/hbase/master/balancer/TestRegionsOnMasterOptions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>132</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>134</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 131).</td>
 <td>135</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 129).</td>
 <td>136</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 129).</td>
 <td>137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>140</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>141</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>142</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>143</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 135).</td>
 <td>151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -42099,13 +42041,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.TestServerAndLoad.java">org/apache/hadoop/hbase/master/balancer/TestServerAndLoad.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -42114,271 +42056,271 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.TestSimpleLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/TestSimpleLoadBalancer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>74</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>75</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>78</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>79</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>80</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>87</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>92</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>97</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>98</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>99</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>101</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>102</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>103</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>104</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>105</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>106</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>108</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>112</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>115</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>117</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>118</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>119</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>172</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -42387,211 +42329,211 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.TestStochasticLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>87</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>97</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>102</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>103</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>104</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>105</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>106</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>107</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>112</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>115</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>119</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>121</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>122</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>123</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>124</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>547</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -42600,19 +42542,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.balancer.TestStochasticLoadBalancerHeterogeneousCostRules.java">org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCostRules.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'junit.framework.TestCase.assertTrue' import.</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -42621,13 +42563,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.cleaner.BaseFileCleanerDelegate.java">org/apache/hadoop/hbase/master/cleaner/BaseFileCleanerDelegate.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -42636,13 +42578,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.cleaner.BaseLogCleanerDelegate.java">org/apache/hadoop/hbase/master/cleaner/BaseLogCleanerDelegate.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -42651,31 +42593,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.cleaner.CleanerChore.java">org/apache/hadoop/hbase/master/cleaner/CleanerChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>379</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 2, expected level should be 4.</td>
 <td>385</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 31 should have line break after.</td>
 <td>385</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -42684,13 +42626,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.cleaner.DirScanPool.java">org/apache/hadoop/hbase/master/cleaner/DirScanPool.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -42699,13 +42641,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.cleaner.FileCleanerDelegate.java">org/apache/hadoop/hbase/master/cleaner/FileCleanerDelegate.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -42714,19 +42656,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.cleaner.TestHFileCleaner.java">org/apache/hadoop/hbase/master/cleaner/TestHFileCleaner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>240</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -42735,13 +42677,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.cleaner.TestSnapshotFromMaster.java">org/apache/hadoop/hbase/master/cleaner/TestSnapshotFromMaster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -42750,19 +42692,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.janitor.TestCatalogJanitor.java">org/apache/hadoop/hbase/master/janitor/TestCatalogJanitor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>357</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -42771,13 +42713,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.janitor.TestMetaFixer.java">org/apache/hadoop/hbase/master/janitor/TestMetaFixer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -42786,25 +42728,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.locking.LockManager.java">org/apache/hadoop/hbase/master/locking/LockManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>232</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -42813,37 +42755,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.locking.LockProcedure.java">org/apache/hadoop/hbase/master/locking/LockProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>207</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>210</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>234</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>237</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -42852,85 +42794,85 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.normalizer.package-info.java">org/apache/hadoop/hbase/master/normalizer/package-info.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>46</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>47</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 121).</td>
 <td>50</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 119).</td>
 <td>51</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 128).</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>57</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>58</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 127).</td>
 <td>59</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -42939,13 +42881,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.AbstractStateMachineRegionProcedure.java">org/apache/hadoop/hbase/master/procedure/AbstractStateMachineRegionProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -42954,127 +42896,127 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.CloneSnapshotProcedure.java">org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>343</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>344</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>371</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>372</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>387</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>448</td></tr>
+<td>387</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>448</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>511</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.EnableTableProcedure.java">org/apache/hadoop/hbase/master/procedure/EnableTableProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>246</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>283</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>284</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>295</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>310</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>326</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>327</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>338</td></tr>
+<td>327</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>338</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>339</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.InitMetaProcedure.java">org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -43083,13 +43025,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv.java">org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -43098,37 +43040,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.MasterProcedureScheduler.java">org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>371</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>374</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>665</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>720</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -43137,31 +43079,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.MasterProcedureTestingUtility.java">org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class MasterProcedureTestingUtility should be declared as final.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>225</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>271</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -43170,13 +43112,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.MasterProcedureUtil.java">org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -43185,26 +43127,26 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.ModifyTableProcedure.java">org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>78</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>84</td></tr>
+<td>78</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>84</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
@@ -43212,25 +43154,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.ProcedureDescriber.java">org/apache/hadoop/hbase/master/procedure/ProcedureDescriber.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.procedure2.Procedure' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.JRubyFormat' import.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -43239,13 +43181,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.ProcedurePrepareLatch.java">org/apache/hadoop/hbase/master/procedure/ProcedurePrepareLatch.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -43254,61 +43196,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.ProcedureSyncWait.java">org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>217</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>243</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>245</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>246</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>247</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>255</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>257</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>258</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -43317,37 +43259,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.RestoreSnapshotProcedure.java">org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>89</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>97</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>104</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>272</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -43356,13 +43298,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.TestDeleteNamespaceProcedure.java">org/apache/hadoop/hbase/master/procedure/TestDeleteNamespaceProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -43371,13 +43313,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.TestMasterObserverPostCalls.java">org/apache/hadoop/hbase/master/procedure/TestMasterObserverPostCalls.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -43386,13 +43328,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.TestMasterProcedureEvents.java">org/apache/hadoop/hbase/master/procedure/TestMasterProcedureEvents.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -43401,13 +43343,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.TestMasterProcedureSchedulerConcurrency.java">org/apache/hadoop/hbase/master/procedure/TestMasterProcedureSchedulerConcurrency.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -43416,13 +43358,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.TestSafemodeBringsDownMaster.java">org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -43431,13 +43373,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.TestTableDescriptorModificationFromClient.java">org/apache/hadoop/hbase/master/procedure/TestTableDescriptorModificationFromClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -43446,19 +43388,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.TestWALProcedureStoreOnHDFS.java">org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 117).</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -43467,19 +43409,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.TruncateTableProcedure.java">org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>62</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -43488,13 +43430,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.region.MasterRegionFactory.java">org/apache/hadoop/hbase/master/region/MasterRegionFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -43503,13 +43445,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.replication.TransitPeerSyncReplicationStateProcedure.java">org/apache/hadoop/hbase/master/replication/TransitPeerSyncReplicationStateProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -43518,13 +43460,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.slowlog.SlowLogMasterService.java">org/apache/hadoop/hbase/master/slowlog/SlowLogMasterService.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -43533,13 +43475,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.EnabledTableSnapshotHandler.java">org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -43548,13 +43490,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.MasterSnapshotVerifier.java">org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -43563,13 +43505,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.SnapshotFileCache.java">org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -43578,118 +43520,118 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.SnapshotManager.java">org/apache/hadoop/hbase/master/snapshot/SnapshotManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>240</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>311</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>353</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>428</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>590</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>698</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>701</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>751</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>820</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>822</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>876</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1062</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1119</td></tr>
+<td>1062</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>1119</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>1123</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.TakeSnapshotHandler.java">org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>66</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>217</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -43698,13 +43640,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.TestSnapshotFileCacheWithDifferentWorkingDir.java">org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCacheWithDifferentWorkingDir.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -43713,13 +43655,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.TestSnapshotHFileCleaner.java">org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -43728,13 +43670,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.TestSnapshotManager.java">org/apache/hadoop/hbase/master/snapshot/TestSnapshotManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -43743,13 +43685,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.CachedMobFile.java">org/apache/hadoop/hbase/mob/CachedMobFile.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -43758,37 +43700,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.DefaultMobStoreCompactor.java">org/apache/hadoop/hbase/mob/DefaultMobStoreCompactor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
 <td>147</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>152</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
 <td>154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 2, 4.</td>
 <td>155</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -43797,37 +43739,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.DefaultMobStoreFlusher.java">org/apache/hadoop/hbase/mob/DefaultMobStoreFlusher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>119</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>130</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>176</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>188</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -43836,13 +43778,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobConstants.java">org/apache/hadoop/hbase/mob/MobConstants.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -43851,58 +43793,58 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobFile.java">org/apache/hadoop/hbase/mob/MobFile.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>56</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>72</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>84</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>119</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>128</td></tr>
+<td>119</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>128</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>144</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobFileCache.java">org/apache/hadoop/hbase/mob/MobFileCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -43911,13 +43853,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobFileName.java">org/apache/hadoop/hbase/mob/MobFileName.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -43926,19 +43868,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobTestUtil.java">org/apache/hadoop/hbase/mob/MobTestUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -43947,13 +43889,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobUtils.java">org/apache/hadoop/hbase/mob/MobUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -43962,13 +43904,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.TestMobWithByteBuffAllocator.java">org/apache/hadoop/hbase/mob/TestMobWithByteBuffAllocator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -43977,19 +43919,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.mapreduce.MobRefReporter.java">org/apache/hadoop/hbase/mob/mapreduce/MobRefReporter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>FileTabCharacter</td>
 <td>File contains tab characters (this is the first instance).</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -43998,19 +43940,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.MemoryBoundedLogMessageBuffer.java">org/apache/hadoop/hbase/monitoring/MemoryBoundedLogMessageBuffer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'message' must be private and have accessor methods.</td>
 <td>96</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
@@ -44019,31 +43961,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.MonitoredRPCHandlerImpl.java">org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Operation' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>125</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>152</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -44052,13 +43994,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.StateDumpServlet.java">org/apache/hadoop/hbase/monitoring/StateDumpServlet.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -44067,13 +44009,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.TaskMonitor.java">org/apache/hadoop/hbase/monitoring/TaskMonitor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -44082,13 +44024,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.TestTaskMonitor.java">org/apache/hadoop/hbase/monitoring/TestTaskMonitor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -44097,109 +44039,109 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.ThreadMonitoring.java">org/apache/hadoop/hbase/monitoring/ThreadMonitoring.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>53</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>54</td></tr>
+<td>53</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>54</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>55</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mttr.IntegrationTestMTTR.java">org/apache/hadoop/hbase/mttr/IntegrationTestMTTR.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.client.TableDescriptor.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>127</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>275</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>344</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>347</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>630</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>631</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>632</td></tr>
+<td>631</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>632</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>633</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namequeues.LogHandlerUtils.java">org/apache/hadoop/hbase/namequeues/LogHandlerUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -44208,19 +44150,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namequeues.NamedQueueRecorder.java">org/apache/hadoop/hbase/namequeues/NamedQueueRecorder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -44229,13 +44171,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namequeues.RpcLogDetails.java">org/apache/hadoop/hbase/namequeues/RpcLogDetails.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -44244,25 +44186,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namequeues.SlowLogPersistentService.java">org/apache/hadoop/hbase/namequeues/SlowLogPersistentService.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.slowlog.SlowLogTableAccessor' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -44271,25 +44213,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namequeues.impl.BalancerDecisionQueueService.java">org/apache/hadoop/hbase/namequeues/impl/BalancerDecisionQueueService.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.common.collect.EvictingQueue' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -44298,13 +44240,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namequeues.request.NamedQueueGetRequest.java">org/apache/hadoop/hbase/namequeues/request/NamedQueueGetRequest.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -44313,19 +44255,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namequeues.response.NamedQueueGetResponse.java">org/apache/hadoop/hbase/namequeues/response/NamedQueueGetResponse.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -44334,13 +44276,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namespace.NamespaceAuditor.java">org/apache/hadoop/hbase/namespace/NamespaceAuditor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -44349,40 +44291,40 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namespace.NamespaceStateManager.java">org/apache/hadoop/hbase/namespace/NamespaceStateManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>78</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>79</td></tr>
+<td>78</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>79</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>80</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namespace.NamespaceTableAndRegionInfo.java">org/apache/hadoop/hbase/namespace/NamespaceTableAndRegionInfo.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -44391,139 +44333,139 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.nio.ByteBuff.java">org/apache/hadoop/hbase/nio/ByteBuff.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>121</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>218</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>227</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>234</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>241</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>242</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>250</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>269</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>275</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>284</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>319</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>328</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>354</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>363</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>390</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>399</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>430</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>448</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>450</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>558</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
@@ -44532,313 +44474,313 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.nio.MultiByteBuff.java">org/apache/hadoop/hbase/nio/MultiByteBuff.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>122</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>131</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>161</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>211</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>244</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>355</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>397</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>462</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>583</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>593</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>606</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>623</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>633</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>706</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>725</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>726</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>762</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>828</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>838</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>919</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>942</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>987</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1034</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1138</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1139</td></tr>
+<td>1138</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>1139</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>1141</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.MasterProcedureManager.java">org/apache/hadoop/hbase/procedure/MasterProcedureManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Stoppable' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.zookeeper.KeeperException' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>62</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>64</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>73</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>82</td></tr>
+<td>73</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>82</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>101</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.Procedure.java">org/apache/hadoop/hbase/procedure/Procedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.errorhandling.ForeignException' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>243</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>251</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>264</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>295</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>307</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>317</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>318</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>343</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>344</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>355</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>356</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>358</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -44847,76 +44789,76 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ProcedureCoordinator.java">org/apache/hadoop/hbase/procedure/ProcedureCoordinator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.common.collect.MapMaker' import.</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>97</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>107</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>121</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>181</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>235</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>236</td></tr>
+<td>235</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>236</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>237</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ProcedureCoordinatorRpcs.java">org/apache/hadoop/hbase/procedure/ProcedureCoordinatorRpcs.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.errorhandling.ForeignException' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -44925,25 +44867,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ProcedureManagerHost.java">org/apache/hadoop/hbase/procedure/ProcedureManagerHost.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.List' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -44952,103 +44894,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ProcedureMember.java">org/apache/hadoop/hbase/procedure/ProcedureMember.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>109</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>110</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>180</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 5, expected level should be 4.</td>
 <td>181</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>182</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>183</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>184</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 5, expected level should be 4.</td>
 <td>185</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>187</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>188</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
 <td>189</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -45057,25 +44999,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ProcedureMemberRpcs.java">org/apache/hadoop/hbase/procedure/ProcedureMemberRpcs.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.errorhandling.ForeignException' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>50</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -45084,25 +45026,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.RegionServerProcedureManager.java">org/apache/hadoop/hbase/procedure/RegionServerProcedureManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -45111,13 +45053,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.SimpleMasterProcedureManager.java">org/apache/hadoop/hbase/procedure/SimpleMasterProcedureManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -45126,37 +45068,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.SimpleRSProcedureManager.java">org/apache/hadoop/hbase/procedure/SimpleRSProcedureManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.errorhandling.ForeignException' import.</td>
 <td>38</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.zookeeper.KeeperException' import.</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>147</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>158</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -45165,136 +45107,136 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.Subprocedure.java">org/apache/hadoop/hbase/procedure/Subprocedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>135</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>245</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>258</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>272</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>302</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>303</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>312</td></tr>
+<td>303</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>312</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>313</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.TestProcedureCoordinator.java">org/apache/hadoop/hbase/procedure/TestProcedureCoordinator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>115</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>146</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>146</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>167</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>176</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>178</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>285</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>330</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -45303,13 +45245,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.TestProcedureDescriber.java">org/apache/hadoop/hbase/procedure/TestProcedureDescriber.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -45318,43 +45260,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.TestProcedureMember.java">org/apache/hadoop/hbase/procedure/TestProcedureMember.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>108</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>233</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>234</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 119).</td>
 <td>411</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -45363,221 +45305,221 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.TestZKProcedure.java">org/apache/hadoop/hbase/procedure/TestZKProcedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>121</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>141</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>150</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'.' has incorrect indentation level 6, expected level should be 8.</td>
 <td>166</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 12, 14.</td>
 <td>176</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 14, 16.</td>
 <td>178</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 14, 16.</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 14, 16.</td>
 <td>180</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 14, 16.</td>
 <td>181</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 12, 14.</td>
 <td>182</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 10, 12.</td>
 <td>183</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>186</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>190</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>219</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'.' has incorrect indentation level 6, expected level should be 8.</td>
 <td>241</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>258</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>261</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 12, 14.</td>
 <td>279</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 14, 16.</td>
 <td>281</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 14, 16.</td>
 <td>282</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 14, 16.</td>
 <td>283</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 12, 14.</td>
 <td>284</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 10, 12.</td>
 <td>285</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>311</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>346</td></tr>
+<td>311</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
+<td>346</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
 <td>375</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.TestZKProcedureControllers.java">org/apache/hadoop/hbase/procedure/TestZKProcedureControllers.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>215</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>229</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>296</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
-<td>310</td></tr>
+<td>296</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>310</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
@@ -45585,19 +45527,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ZKProcedureCoordinator.java">org/apache/hadoop/hbase/procedure/ZKProcedureCoordinator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>197</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -45606,25 +45548,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ZKProcedureMemberRpcs.java">org/apache/hadoop/hbase/procedure/ZKProcedureMemberRpcs.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.errorhandling.ForeignException' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -45633,37 +45575,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ZKProcedureUtil.java">org/apache/hadoop/hbase/procedure/ZKProcedureUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.zookeeper.ZKUtil' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'baseZNode' must be private and have accessor methods.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>242</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>245</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -45672,19 +45614,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.flush.FlushTableSubprocedure.java">org/apache/hadoop/hbase/procedure/flush/FlushTableSubprocedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Arrays.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -45693,13 +45635,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.flush.MasterFlushTableProcedureManager.java">org/apache/hadoop/hbase/procedure/flush/MasterFlushTableProcedureManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -45708,79 +45650,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.flush.RegionServerFlushTableProcedureManager.java">org/apache/hadoop/hbase/procedure/flush/RegionServerFlushTableProcedureManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.zookeeper.KeeperException' import.</td>
 <td>50</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>92</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>113</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>133</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>177</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>255</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>300</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>311</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -45789,13 +45731,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.java">org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -45804,13 +45746,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure2.store.region.HFileProcedurePrettyPrinter.java">org/apache/hadoop/hbase/procedure2/store/region/HFileProcedurePrettyPrinter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -45819,13 +45761,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure2.store.region.TestHFileProcedurePrettyPrinter.java">org/apache/hadoop/hbase/procedure2/store/region/TestHFileProcedurePrettyPrinter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -45834,25 +45776,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.protobuf.ProtobufMagic.java">org/apache/hadoop/hbase/protobuf/ProtobufMagic.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class ProtobufMagic should be declared as final.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -45861,13 +45803,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.protobuf.ProtobufMessageConverter.java">org/apache/hadoop/hbase/protobuf/ProtobufMessageConverter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -45876,25 +45818,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.protobuf.ReplicationProtobufUtil.java">org/apache/hadoop/hbase/protobuf/ReplicationProtobufUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>44</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>135</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -45903,13 +45845,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.protobuf.TestReplicationProtobuf.java">org/apache/hadoop/hbase/protobuf/TestReplicationProtobuf.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -45918,13 +45860,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.ActivePolicyEnforcement.java">org/apache/hadoop/hbase/quotas/ActivePolicyEnforcement.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -45933,13 +45875,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.AverageIntervalRateLimiter.java">org/apache/hadoop/hbase/quotas/AverageIntervalRateLimiter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -45948,19 +45890,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.DefaultOperationQuota.java">org/apache/hadoop/hbase/quotas/DefaultOperationQuota.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Mutation' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -45969,31 +45911,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.FileSystemUtilizationChore.java">org/apache/hadoop/hbase/quotas/FileSystemUtilizationChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>47</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>50</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -46002,13 +45944,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.FixedIntervalRateLimiter.java">org/apache/hadoop/hbase/quotas/FixedIntervalRateLimiter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46017,19 +45959,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.GlobalQuotaSettingsImpl.java">org/apache/hadoop/hbase/quotas/GlobalQuotaSettingsImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Map.Entry' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -46038,13 +45980,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.NamespaceQuotaSnapshotStore.java">org/apache/hadoop/hbase/quotas/NamespaceQuotaSnapshotStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -46053,19 +45995,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.NoopOperationQuota.java">org/apache/hadoop/hbase/quotas/NoopOperationQuota.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Mutation' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -46074,13 +46016,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.NoopQuotaLimiter.java">org/apache/hadoop/hbase/quotas/NoopQuotaLimiter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -46089,13 +46031,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.OperationQuota.java">org/apache/hadoop/hbase/quotas/OperationQuota.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46104,13 +46046,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.QuotaCache.java">org/apache/hadoop/hbase/quotas/QuotaCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46119,13 +46061,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.QuotaLimiterFactory.java">org/apache/hadoop/hbase/quotas/QuotaLimiterFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -46134,13 +46076,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.QuotaObserverChore.java">org/apache/hadoop/hbase/quotas/QuotaObserverChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -46149,13 +46091,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.QuotaRetriever.java">org/apache/hadoop/hbase/quotas/QuotaRetriever.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46164,13 +46106,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.QuotaSettingsFactory.java">org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -46179,13 +46121,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.QuotaState.java">org/apache/hadoop/hbase/quotas/QuotaState.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46194,25 +46136,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.QuotaTableUtil.java">org/apache/hadoop/hbase/quotas/QuotaTableUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>89</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>483</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -46221,43 +46163,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.QuotaUtil.java">org/apache/hadoop/hbase/quotas/QuotaUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>288</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>371</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>383</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>387</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>464</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -46266,115 +46208,115 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.RateLimiter.java">org/apache/hadoop/hbase/quotas/RateLimiter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>79</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>80</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>87</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>90</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>95</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -46383,19 +46325,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.RegionServerSpaceQuotaManager.java">org/apache/hadoop/hbase/quotas/RegionServerSpaceQuotaManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Map.Entry' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -46404,13 +46346,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.SnapshotQuotaObserverChore.java">org/apache/hadoop/hbase/quotas/SnapshotQuotaObserverChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46419,13 +46361,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.SpaceLimitSettings.java">org/apache/hadoop/hbase/quotas/SpaceLimitSettings.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46434,25 +46376,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.SpaceQuotaHelperForTests.java">org/apache/hadoop/hbase/quotas/SpaceQuotaHelperForTests.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>169</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>295</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -46461,13 +46403,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot.java">org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshot.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46476,13 +46418,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifier.java">org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifier.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46491,13 +46433,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifierFactory.java">org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifierFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -46506,13 +46448,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifierForTest.java">org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifierForTest.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46521,13 +46463,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.SpaceViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/SpaceViolationPolicyEnforcement.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46536,19 +46478,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.SpaceViolationPolicyEnforcementFactory.java">org/apache/hadoop/hbase/quotas/SpaceViolationPolicyEnforcementFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot.SpaceQuotaStatus' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -46557,13 +46499,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.TableQuotaSnapshotStore.java">org/apache/hadoop/hbase/quotas/TableQuotaSnapshotStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -46572,13 +46514,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.TestFileSystemUtilizationChore.java">org/apache/hadoop/hbase/quotas/TestFileSystemUtilizationChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -46587,52 +46529,52 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.TestQuotaObserverChoreWithMiniCluster.java">org/apache/hadoop/hbase/quotas/TestQuotaObserverChoreWithMiniCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>144</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>186</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>349</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>367</td></tr>
+<td>349</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
+<td>367</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>427</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.TestRateLimiter.java">org/apache/hadoop/hbase/quotas/TestRateLimiter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -46641,19 +46583,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.TestSnapshotQuotaObserverChore.java">org/apache/hadoop/hbase/quotas/TestSnapshotQuotaObserverChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.snapshot.SnapshotReferenceUtil.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -46662,13 +46604,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.TestTableQuotaViolationStore.java">org/apache/hadoop/hbase/quotas/TestTableQuotaViolationStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -46677,13 +46619,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.TestTablesWithQuotas.java">org/apache/hadoop/hbase/quotas/TestTablesWithQuotas.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -46692,13 +46634,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.TimeBasedLimiter.java">org/apache/hadoop/hbase/quotas/TimeBasedLimiter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -46707,46 +46649,46 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.UserQuotaState.java">org/apache/hadoop/hbase/quotas/UserQuotaState.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.EnvironmentEdgeManager' import.</td>
 <td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>57</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>197</td></tr>
+<td>57</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>197</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>201</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.policies.BaseViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/BaseViolationPolicyEnforcement.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -46755,13 +46697,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.policies.DefaultViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/DefaultViolationPolicyEnforcement.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46770,13 +46712,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.policies.NoInsertsViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/NoInsertsViolationPolicyEnforcement.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46785,13 +46727,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.policies.NoWritesCompactionsViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/NoWritesCompactionsViolationPolicyEnforcement.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46800,13 +46742,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.policies.NoWritesViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/NoWritesViolationPolicyEnforcement.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46815,31 +46757,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.policies.TestBulkLoadCheckingViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/TestBulkLoadCheckingViolationPolicyEnforcement.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>95</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>119</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -46848,13 +46790,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.AbstractMemStore.java">org/apache/hadoop/hbase/regionserver/AbstractMemStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -46863,13 +46805,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.AbstractTestDateTieredCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/AbstractTestDateTieredCompactionPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -46878,85 +46820,85 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.AnnotationReadingPriorityFunction.java">org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>87</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>178</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>180</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>231</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>256</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -46965,13 +46907,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ByteBufferChunkKeyValue.java">org/apache/hadoop/hbase/regionserver/ByteBufferChunkKeyValue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46980,13 +46922,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CSLMImmutableSegment.java">org/apache/hadoop/hbase/regionserver/CSLMImmutableSegment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -46995,19 +46937,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CellArrayImmutableSegment.java">org/apache/hadoop/hbase/regionserver/CellArrayImmutableSegment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ClassSize' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -47016,25 +46958,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CellArrayMap.java">org/apache/hadoop/hbase/regionserver/CellArrayMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>51</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -47043,31 +46985,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CellChunkMap.java">org/apache/hadoop/hbase/regionserver/CellChunkMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ByteBufferUtils' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Comparator' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -47076,73 +47018,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CellFlatMap.java">org/apache/hadoop/hbase/regionserver/CellFlatMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Collection' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.NavigableMap' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 0, expected level should be 2.</td>
 <td>137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>151</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>289</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -47151,13 +47093,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CellSet.java">org/apache/hadoop/hbase/regionserver/CellSet.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -47166,19 +47108,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CellSink.java">org/apache/hadoop/hbase/regionserver/CellSink.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.BloomFilterWriter' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -47187,13 +47129,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ChangedReadersObserver.java">org/apache/hadoop/hbase/regionserver/ChangedReadersObserver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -47202,31 +47144,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ChunkCreator.java">org/apache/hadoop/hbase/regionserver/ChunkCreator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>347</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>388</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>413</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -47235,19 +47177,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CompactedHFilesDischargeHandler.java">org/apache/hadoop/hbase/regionserver/CompactedHFilesDischargeHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.executor.EventHandler' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>RedundantImport</td>
@@ -47256,19 +47198,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CompactedHFilesDischarger.java">org/apache/hadoop/hbase/regionserver/CompactedHFilesDischarger.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -47277,31 +47219,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CompactingMemStore.java">org/apache/hadoop/hbase/regionserver/CompactingMemStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>172</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 1, expected level should be 2.</td>
 <td>443</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -47310,25 +47252,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CompactionPipeline.java">org/apache/hadoop/hbase/regionserver/CompactionPipeline.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>228</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>228</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -47337,19 +47279,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CompositeImmutableSegment.java">org/apache/hadoop/hbase/regionserver/CompositeImmutableSegment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -47358,31 +47300,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CreateRandomStoreFile.java">org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>187</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 7 should be on the previous line.</td>
 <td>273</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -47391,31 +47333,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.DataBlockEncodingTool.java">org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>245</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call rparen' has incorrect indentation level 16, expected level should be 12.</td>
 <td>314</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>408</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -47424,13 +47366,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.DateTieredStoreEngine.java">org/apache/hadoop/hbase/regionserver/DateTieredStoreEngine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -47439,193 +47381,193 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.DefaultHeapMemoryTuner.java">org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HConstants.HFILE_BLOCK_CACHE_SIZE_KEY' import.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>193</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>208</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>269</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 10.</td>
 <td>270</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>275</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>276</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 10, expected level should be 12.</td>
 <td>277</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>278</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be 12.</td>
 <td>279</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>280</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else rcurly' has incorrect indentation level 10, expected level should be 12.</td>
 <td>281</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>282</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>283</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>284</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>285</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 10.</td>
 <td>286</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>291</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>292</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 10, expected level should be 12.</td>
 <td>293</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>294</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be 12.</td>
 <td>295</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>296</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else rcurly' has incorrect indentation level 10, expected level should be 12.</td>
 <td>297</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>298</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>299</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>300</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>301</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -47634,19 +47576,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.DefaultMemStore.java">org/apache/hadoop/hbase/regionserver/DefaultMemStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -47655,19 +47597,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher.java">org/apache/hadoop/hbase/regionserver/DefaultStoreFlusher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -47676,19 +47618,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.DelimitedKeyPrefixRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/DelimitedKeyPrefixRegionSplitPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -47697,13 +47639,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/DisabledRegionSplitPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -47712,46 +47654,46 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.FavoredNodesForRegion.java">org/apache/hadoop/hbase/regionserver/FavoredNodesForRegion.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>25</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>35</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>36</td></tr>
+<td>35</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>36</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>43</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.FifoRpcSchedulerFactory.java">org/apache/hadoop/hbase/regionserver/FifoRpcSchedulerFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -47760,19 +47702,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.FlushPolicyFactory.java">org/apache/hadoop/hbase/regionserver/FlushPolicyFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.TableDescriptor' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -47781,13 +47723,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.FlushRequestListener.java">org/apache/hadoop/hbase/regionserver/FlushRequestListener.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -47796,1246 +47738,1246 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.FlushRequester.java">org/apache/hadoop/hbase/regionserver/FlushRequester.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>61</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>68</td></tr>
+<td>61</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>68</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>76</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HMobStore.java">org/apache/hadoop/hbase/regionserver/HMobStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>181</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>222</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>238</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>283</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>296</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>311</td></tr>
+<td>296</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>311</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>383</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HRegion.java">org/apache/hadoop/hbase/regionserver/HRegion.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>422</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>423</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>717</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>719</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>720</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>721</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>722</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>723</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>727</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>747</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>748</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>749</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>750</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>751</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1097</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1098</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>1118</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1281</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1369</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1526</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1527</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1531</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1532</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1583</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1584</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1588</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1589</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>1621</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1623</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 262 lines (max allowed is 150).</td>
 <td>1630</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1943</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1950</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2165</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2181</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2241</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2407</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2431</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2434</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2491</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2492</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>2703</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>2811</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2884</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>2903</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2925</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2957</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3099</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
 <td>3113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>4659</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>4910</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>5000</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>5010</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>5011</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>5016</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 3, expected level should be 4.</td>
 <td>5101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>5102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>5152</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>5154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>5225</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>5227</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 195 lines (max allowed is 150).</td>
 <td>5385</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 9, expected level should be 8.</td>
 <td>5577</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>5665</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>5666</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>5667</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>5668</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>5669</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>5670</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>5671</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>5672</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>5673</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>5674</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>5675</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>5676</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>5677</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>5678</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>5679</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>5681</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>5925</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>5926</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>5927</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>5928</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>6023</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>6463</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>6551</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>6786</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>6787</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>6791</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>6808</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>6817</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>6825</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>6835</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>6837</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 207 lines (max allowed is 150).</td>
 <td>6843</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>7189</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>7194</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7203</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7204</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7205</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>7211</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>7217</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7227</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7228</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7229</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>7232</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>7236</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7246</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7247</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7248</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>7253</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>7259</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7278</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7279</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7280</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7297</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7298</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7299</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7319</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7320</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7321</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>7395</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>7532</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7586</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>7590</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>7592</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>8001</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>8002</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>8004</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>8005</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>8017</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>8018</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>8091</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 10.</td>
 <td>8093</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>8094</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>8095</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>8096</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>8097</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>8099</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>8100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>8102</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>8103</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>8106</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>8109</td></tr>
+<td>8106</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>8109</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>8110</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def rcurly' has incorrect indentation level 1, expected level should be 2.</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>198</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>211</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>347</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>370</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>383</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>388</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>409</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>422</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>462</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>477</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>482</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>547</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>595</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>599</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>623</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>637</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>697</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>771</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>814</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>816</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>840</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>873</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>875</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>949</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1032</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1139</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1141</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1151</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1166</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1168</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1201</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1203</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1206</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1221</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -49044,295 +48986,295 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HRegionServer.java">org/apache/hadoop/hbase/regionserver/HRegionServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'TEST_SKIP_REPORTING_TRANSITION' must be private and have accessor methods.</td>
 <td>258</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'compactSplitThread' must be private and have accessor methods.</td>
 <td>307</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>476</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>493</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>494</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 126).</td>
 <td>498</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>724</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>725</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>870</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 235 lines (max allowed is 150).</td>
 <td>997</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1131</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1132</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1133</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>1140</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1239</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1475</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1583</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 16, expected level should be 18.</td>
 <td>1877</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1912</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 153 lines (max allowed is 150).</td>
 <td>2010</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'HConstants' has incorrect indentation level 6, expected level should be 8.</td>
 <td>2020</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2515</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>2549</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2624</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2728</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2835</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2848</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2851</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2929</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2934</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>3244</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'synchronized' has incorrect indentation level 5, expected level should be 4.</td>
 <td>3245</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 7, expected level should be 6.</td>
 <td>3246</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 9, expected level should be 8.</td>
 <td>3247</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 9, expected level should be 8.</td>
 <td>3248</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 11, expected level should be 10.</td>
 <td>3249</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 9, expected level should be 8.</td>
 <td>3250</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rcurly' has incorrect indentation level 7, expected level should be 6.</td>
 <td>3251</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'synchronized rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>3252</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>3253</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
 <td>3254</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>3428</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>3433</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3550</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>3570</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>3587</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>3608</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -49341,19 +49283,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.java">org/apache/hadoop/hbase/regionserver/HRegionServerCommandLine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -49362,19 +49304,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HStore.java">org/apache/hadoop/hbase/regionserver/HStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>299</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -49383,94 +49325,94 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HStoreFile.java">org/apache/hadoop/hbase/regionserver/HStoreFile.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>211</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>543</td></tr>
+<td>211</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>543</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>554</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HeapMemoryManager.java">org/apache/hadoop/hbase/regionserver/HeapMemoryManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>235</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>403</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>404</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>405</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>406</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>407</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>408</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>411</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>413</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -49479,19 +49421,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HeapMemoryTuner.java">org/apache/hadoop/hbase/regionserver/HeapMemoryTuner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -49500,19 +49442,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ImmutableSegment.java">org/apache/hadoop/hbase/regionserver/ImmutableSegment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -49521,25 +49463,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/IncreasingToUpperBoundRegionSplitPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.TableDescriptor' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -49548,25 +49490,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.InternalScan.java">org/apache/hadoop/hbase/regionserver/InternalScan.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Get' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>53</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -49575,19 +49517,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.InternalScanner.java">org/apache/hadoop/hbase/regionserver/InternalScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -49596,94 +49538,94 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.KeyValueHeap.java">org/apache/hadoop/hbase/regionserver/KeyValueHeap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>74</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>75</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>86</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>184</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>204</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>205</td></tr>
+<td>204</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>205</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>249</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.KeyValueScanner.java">org/apache/hadoop/hbase/regionserver/KeyValueScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.fs.Path' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>174</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>180</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -49692,13 +49634,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.LeaseException.java">org/apache/hadoop/hbase/regionserver/LeaseException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -49707,25 +49649,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.LeaseManager.java">org/apache/hadoop/hbase/regionserver/LeaseManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>80</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>104</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -49734,67 +49676,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MemStore.java">org/apache/hadoop/hbase/regionserver/MemStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.UnexpectedStateException' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>46</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>47</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>69</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>99</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>108</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>123</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 39 should have line break after.</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -49803,13 +49745,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MemStoreCompactor.java">org/apache/hadoop/hbase/regionserver/MemStoreCompactor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -49818,13 +49760,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MemStoreCompactorSegmentsIterator.java">org/apache/hadoop/hbase/regionserver/MemStoreCompactorSegmentsIterator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -49833,140 +49775,140 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MemStoreFlusher.java">org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.htrace.core.TraceScope' import.</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>117</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>118</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class FlushHandler should be declared as final.</td>
 <td>325</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>344</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>525</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>563</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>565</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>566</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>610</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>611</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>612</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>615</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>616</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>822</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>831</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>841</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>881</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>897</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>909</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>910</td></tr>
+<td>909</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>910</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 4.</td>
@@ -49974,13 +49916,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MemStoreLAB.java">org/apache/hadoop/hbase/regionserver/MemStoreLAB.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -49989,19 +49931,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MemStoreLABImpl.java">org/apache/hadoop/hbase/regionserver/MemStoreLABImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>62</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -50010,13 +49952,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MemStoreMergerSegmentsIterator.java">org/apache/hadoop/hbase/regionserver/MemStoreMergerSegmentsIterator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -50025,13 +49967,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MemStoreSegmentsIterator.java">org/apache/hadoop/hbase/regionserver/MemStoreSegmentsIterator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -50040,13 +49982,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MemStoreSnapshot.java">org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -50055,13 +49997,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MetricsRegion.java">org/apache/hadoop/hbase/regionserver/MetricsRegion.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -50070,19 +50012,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MetricsRegionServer.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -50091,13 +50033,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MetricsRegionServerSource.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -50106,13 +50048,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MetricsRegionServerSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -50121,19 +50063,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MetricsRegionServerWrapperImpl.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 244 lines (max allowed is 150).</td>
 <td>679</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -50142,13 +50084,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MetricsTable.java">org/apache/hadoop/hbase/regionserver/MetricsTable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -50157,13 +50099,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MetricsTableWrapperAggregateImpl.java">org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -50172,13 +50114,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MetricsUserAggregateFactory.java">org/apache/hadoop/hbase/regionserver/MetricsUserAggregateFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -50187,68 +50129,68 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress.java">org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Mutation' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>100</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>101</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>108</td></tr>
+<td>101</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>108</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
@@ -50256,13 +50198,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MobReferenceOnlyFilter.java">org/apache/hadoop/hbase/regionserver/MobReferenceOnlyFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -50271,19 +50213,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl.java">org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -50292,13 +50234,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MutableOnlineRegions.java">org/apache/hadoop/hbase/regionserver/MutableOnlineRegions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -50307,19 +50249,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MutableSegment.java">org/apache/hadoop/hbase/regionserver/MutableSegment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -50328,13 +50270,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.NoTagByteBufferChunkKeyValue.java">org/apache/hadoop/hbase/regionserver/NoTagByteBufferChunkKeyValue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -50343,13 +50285,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.NonLazyKeyValueScanner.java">org/apache/hadoop/hbase/regionserver/NonLazyKeyValueScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -50358,13 +50300,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.NonReversedNonLazyKeyValueScanner.java">org/apache/hadoop/hbase/regionserver/NonReversedNonLazyKeyValueScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -50373,13 +50315,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.OOMERegionServer.java">org/apache/hadoop/hbase/regionserver/OOMERegionServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -50388,43 +50330,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.OnlineRegions.java">org/apache/hadoop/hbase/regionserver/OnlineRegions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>41</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>49</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -50433,13 +50375,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RSDumpServlet.java">org/apache/hadoop/hbase/regionserver/RSDumpServlet.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -50448,241 +50390,241 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RSRpcServices.java">org/apache/hadoop/hbase/regionserver/RSRpcServices.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'class def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>431</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>574</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>685</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>731</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 162 lines (max allowed is 150).</td>
 <td>736</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>750</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>766</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>949</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>950</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>951</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1127</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1130</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1563</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ClientService' has incorrect indentation level 6, expected level should be 8.</td>
 <td>1573</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ClientService' has incorrect indentation level 6, expected level should be 8.</td>
 <td>1574</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'AdminService' has incorrect indentation level 6, expected level should be 8.</td>
 <td>1578</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'AdminService' has incorrect indentation level 6, expected level should be 8.</td>
 <td>1579</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>1611</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1636</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1669</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1736</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1917</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2020</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 121).</td>
 <td>2038</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'regionServer' has incorrect indentation level 14, expected level should be 16.</td>
 <td>2128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'regionOpenInfo' has incorrect indentation level 16, expected level should be 18.</td>
 <td>2132</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'regionServer' has incorrect indentation level 16, expected level should be 18.</td>
 <td>2136</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'regionServer' has incorrect indentation level 16, expected level should be 18.</td>
 <td>2139</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2199</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2345</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2369</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2555</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2752</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 229 lines (max allowed is 150).</td>
 <td>2754</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 189 lines (max allowed is 150).</td>
 <td>3356</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3554</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -50691,701 +50633,701 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RSStatusServlet.java">org/apache/hadoop/hbase/regionserver/RSStatusServlet.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>50</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>52</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>54</td></tr>
+<td>52</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>54</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>56</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.Region.java">org/apache/hadoop/hbase/regionserver/Region.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>111</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>129</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>225</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>231</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>238</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>273</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>284</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>286</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>299</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>472</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>473</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>488</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>525</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>527</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>537</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>546</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>550</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>552</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>561</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>562</td></tr>
+<td>561</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>562</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>597</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RegionAsTable.java">org/apache/hadoop/hbase/regionserver/RegionAsTable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>107</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>205</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>215</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>245</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>252</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>271</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>278</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>286</td></tr>
+<td>278</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>286</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>293</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost.java">org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>209</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>332</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>333</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>334</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda arguments' has incorrect indentation level 14, expected level should be 12.</td>
 <td>423</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>570</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>636</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>667</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>672</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>701</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>709</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>723</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>736</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>804</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>926</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>929</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1298</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1323</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1354</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1356</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1357</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1358</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1367</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1369</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1370</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1371</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1378</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1396</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1398</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1399</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1400</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1411</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1413</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1414</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1415</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1422</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1429</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1431</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1432</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1433</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1438</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1445</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1447</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1448</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1449</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1468</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1470</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1471</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1472</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>1475</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1478</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1480</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1481</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1482</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1488</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1507</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1509</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1510</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1511</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1517</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>1519</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>1520</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>1521</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1529</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1532</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1533</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>1542</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1556</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1560</td></tr>
+<td>1556</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1560</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
@@ -51393,13 +51335,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RegionScanner.java">org/apache/hadoop/hbase/regionserver/RegionScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -51408,13 +51350,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RegionScannerImpl.java">org/apache/hadoop/hbase/regionserver/RegionScannerImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -51423,13 +51365,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RegionServerAccounting.java">org/apache/hadoop/hbase/regionserver/RegionServerAccounting.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -51438,50 +51380,50 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RegionServerCoprocessorHost.java">org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>181</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>183</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>185</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'ctor def' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>290</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>291</td></tr>
+<td>290</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'ctor def' child has incorrect indentation level 7, expected level should be 6.</td>
+<td>291</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
@@ -51489,26 +51431,26 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RegionServerServices.java">org/apache/hadoop/hbase/regionserver/RegionServerServices.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>61</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>65</td></tr>
+<td>61</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>65</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
@@ -51516,58 +51458,58 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>84</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>106</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>107</td></tr>
+<td>106</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>107</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>109</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ReplicationSinkService.java">org/apache/hadoop/hbase/regionserver/ReplicationSinkService.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.CellScanner' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -51576,70 +51518,70 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ReversedKeyValueHeap.java">org/apache/hadoop/hbase/regionserver/ReversedKeyValueHeap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>44</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>164</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>181</td></tr>
+<td>164</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>181</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>182</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ReversedStoreScanner.java">org/apache/hadoop/hbase/regionserver/ReversedStoreScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -51648,13 +51590,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.RpcSchedulerFactory.java">org/apache/hadoop/hbase/regionserver/RpcSchedulerFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -51663,25 +51605,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ScanInfo.java">org/apache/hadoop/hbase/regionserver/ScanInfo.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>56</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -51690,25 +51632,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ScanOptions.java">org/apache/hadoop/hbase/regionserver/ScanOptions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 131).</td>
 <td>41</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 133).</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -51717,76 +51659,76 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ScannerContext.java">org/apache/hadoop/hbase/regionserver/ScannerContext.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.metrics.ServerSideScanMetrics' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>235</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>243</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>252</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>261</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>583</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>621</td></tr>
+<td>583</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>621</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>651</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ScannerIdGenerator.java">org/apache/hadoop/hbase/regionserver/ScannerIdGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -51795,26 +51737,26 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.SecureBulkLoadManager.java">org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>453</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>455</td></tr>
+<td>453</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>455</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
@@ -51822,13 +51764,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.Segment.java">org/apache/hadoop/hbase/regionserver/Segment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -51837,67 +51779,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.SegmentFactory.java">org/apache/hadoop/hbase/regionserver/SegmentFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>132</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>133</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>135</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>139</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -51906,19 +51848,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.SegmentScanner.java">org/apache/hadoop/hbase/regionserver/SegmentScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -51927,64 +51869,64 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ServerNonceManager.java">org/apache/hadoop/hbase/regionserver/ServerNonceManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>149</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>240</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>243</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>275</td></tr>
+<td>243</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>275</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>277</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ShipperListener.java">org/apache/hadoop/hbase/regionserver/ShipperListener.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -51993,49 +51935,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.ShutdownHook.java">org/apache/hadoop/hbase/regionserver/ShutdownHook.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'this' has incorrect indentation level 14, expected level should be 16.</td>
 <td>127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>256</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -52044,13 +51986,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.SimpleRpcSchedulerFactory.java">org/apache/hadoop/hbase/regionserver/SimpleRpcSchedulerFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -52059,13 +52001,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.SplitWALCallable.java">org/apache/hadoop/hbase/regionserver/SplitWALCallable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -52074,73 +52016,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.SteppingSplitPolicy.java">org/apache/hadoop/hbase/regionserver/SteppingSplitPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>31</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>32</td></tr>
+<td>31</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>32</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>33</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.Store.java">org/apache/hadoop/hbase/regionserver/Store.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>97</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>203</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>204</td></tr>
+<td>203</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>204</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>256</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StoreFileComparators.java">org/apache/hadoop/hbase/regionserver/StoreFileComparators.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -52149,13 +52091,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StoreFileInfo.java">org/apache/hadoop/hbase/regionserver/StoreFileInfo.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -52164,19 +52106,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StoreFileManager.java">org/apache/hadoop/hbase/regionserver/StoreFileManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>68</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -52185,127 +52127,127 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StoreFileReader.java">org/apache/hadoop/hbase/regionserver/StoreFileReader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
 <td>38</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>514</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>534</td></tr>
+<td>514</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>534</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>653</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StoreFileScanner.java">org/apache/hadoop/hbase/regionserver/StoreFileScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>212</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>240</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>297</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>308</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>309</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>311</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>314</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>333</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>453</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>502</td></tr>
+<td>453</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>502</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>510</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StoreFileWriter.java">org/apache/hadoop/hbase/regionserver/StoreFileWriter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -52314,40 +52256,40 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StoreFlushContext.java">org/apache/hadoop/hbase/regionserver/StoreFlushContext.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>61</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>71</td></tr>
+<td>61</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>71</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>77</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StoreFlusher.java">org/apache/hadoop/hbase/regionserver/StoreFlusher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -52356,160 +52298,160 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StoreScanner.java">org/apache/hadoop/hbase/regionserver/StoreScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.HConstants.</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>233</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>392</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>393</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>396</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>542</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>543</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 225 lines (max allowed is 150).</td>
 <td>546</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>755</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>886</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>911</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1056</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1057</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1058</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1059</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1074</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1076</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1168</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1172</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1208</td></tr>
+<td>1172</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1208</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>1210</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StoreUtils.java">org/apache/hadoop/hbase/regionserver/StoreUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -52518,25 +52460,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StorefileRefresherChore.java">org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -52545,19 +52487,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StripeMultiFileWriter.java">org/apache/hadoop/hbase/regionserver/StripeMultiFileWriter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>34</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -52566,13 +52508,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StripeStoreConfig.java">org/apache/hadoop/hbase/regionserver/StripeStoreConfig.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -52581,13 +52523,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StripeStoreEngine.java">org/apache/hadoop/hbase/regionserver/StripeStoreEngine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -52596,106 +52538,106 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StripeStoreFileManager.java">org/apache/hadoop/hbase/regionserver/StripeStoreFileManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'stripeEndRows' must be private and have accessor methods.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'stripeFiles' must be private and have accessor methods.</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'level0Files' must be private and have accessor methods.</td>
 <td>105</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'allFilesCached' must be private and have accessor methods.</td>
 <td>108</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>513</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>514</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>518</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>588</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>596</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>737</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>901</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>918</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>922</td></tr>
+<td>918</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>922</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>964</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.StripeStoreFlusher.java">org/apache/hadoop/hbase/regionserver/StripeStoreFlusher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -52704,61 +52646,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestAtomicOperation.java">org/apache/hadoop/hbase/regionserver/TestAtomicOperation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'&quot; The Universe, and Everything&quot;' has incorrect indentation level 4, expected level should be 6.</td>
 <td>144</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>283</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>293</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>392</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>393</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>577</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>578</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def rcurly' has incorrect indentation level 3, expected level should be 4.</td>
 <td>702</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -52767,19 +52709,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestBlocksScanned.java">org/apache/hadoop/hbase/regionserver/TestBlocksScanned.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>119</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
@@ -52788,43 +52730,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestCellFlatSet.java">org/apache/hadoop/hbase/regionserver/TestCellFlatSet.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>67</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>207</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>287</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -52833,13 +52775,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestCellSkipListSet.java">org/apache/hadoop/hbase/regionserver/TestCellSkipListSet.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -52848,19 +52790,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestClearRegionBlockCache.java">org/apache/hadoop/hbase/regionserver/TestClearRegionBlockCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>181</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
@@ -52869,43 +52811,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestColumnSeeking.java">org/apache/hadoop/hbase/regionserver/TestColumnSeeking.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>152</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>168</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>169</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>267</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>283</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
@@ -52914,61 +52856,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestCompactingMemStore.java">org/apache/hadoop/hbase/regionserver/TestCompactingMemStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>161</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>162</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>222</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>248</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>310</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>371</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -52977,103 +52919,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestCompactingToCellFlatMapMemStore.java">org/apache/hadoop/hbase/regionserver/TestCompactingToCellFlatMapMemStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>130</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>164</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>187</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>322</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>333</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>341</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>356</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>401</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda arguments' has incorrect indentation level 8, expected level should be 6.</td>
 <td>403</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda arguments' has incorrect indentation level 8, expected level should be 6.</td>
 <td>405</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>421</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda arguments' has incorrect indentation level 8, expected level should be 6.</td>
 <td>423</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda arguments' has incorrect indentation level 8, expected level should be 6.</td>
 <td>425</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>438</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda arguments' has incorrect indentation level 8, expected level should be 6.</td>
 <td>440</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -53082,31 +53024,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestCompaction.java">org/apache/hadoop/hbase/regionserver/TestCompaction.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>616</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -53115,49 +53057,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestCompactionState.java">org/apache/hadoop/hbase/regionserver/TestCompactionState.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>153</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>155</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>158</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>159</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>223</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -53166,103 +53108,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestCompoundBloomFilter.java">org/apache/hadoop/hbase/regionserver/TestCompoundBloomFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 51.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 51.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 30.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>105</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 51.</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 10 should have line break after.</td>
 <td>107</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>109</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 55.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 10 should have line break after.</td>
 <td>111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>117</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>148</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>331</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -53271,37 +53213,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestDateTieredCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/TestDateTieredCompactionPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 82.</td>
 <td>86</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 83.</td>
 <td>194</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 82.</td>
 <td>208</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>245</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -53310,13 +53252,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestDateTieredCompactionPolicyOverflow.java">org/apache/hadoop/hbase/regionserver/TestDateTieredCompactionPolicyOverflow.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -53325,103 +53267,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestDefaultMemStore.java">org/apache/hadoop/hbase/regionserver/TestDefaultMemStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>164</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>174</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>240</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>241</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>299</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>512</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>531</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>570</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>824</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>864</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>907</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1010</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1020</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>1041</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>1088</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -53430,13 +53372,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestFSErrorsExposed.java">org/apache/hadoop/hbase/regionserver/TestFSErrorsExposed.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -53445,19 +53387,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestFailedAppendAndSync.java">org/apache/hadoop/hbase/regionserver/TestFailedAppendAndSync.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>300</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -53466,244 +53408,244 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHMobStore.java">org/apache/hadoop/hbase/regionserver/TestHMobStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>124</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>211</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>246</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>290</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>336</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>380</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>463</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>464</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>475</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>476</td></tr>
+<td>475</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>476</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>477</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegion.java">org/apache/hadoop/hbase/regionserver/TestHRegion.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>271</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>307</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>483</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 6, expected level should be 8.</td>
 <td>1215</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1478</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>1480</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1497</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>1499</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3789</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>4452</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>4522</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>4523</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>4705</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class PutThread should be declared as final.</td>
 <td>4716</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>4892</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>4954</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>5105</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>5116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>5117</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>5135</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>5168</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>5292</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>5378</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>5437</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>5829</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 160 lines (max allowed is 150).</td>
 <td>6272</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -53712,58 +53654,58 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>286</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>292</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>298</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>331</td></tr>
+<td>298</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>331</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>343</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestHRegionOnCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>152</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -53772,103 +53714,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionReplayEvents.java">org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>315</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>374</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>376</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>476</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>582</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>672</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>784</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>786</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>883</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>887</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>1043</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>1461</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>1585</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1643</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -53877,292 +53819,292 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionServerBulkLoad.java">org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>188</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>253</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>260</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>279</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>280</td></tr>
+<td>279</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
+<td>280</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
 <td>390</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHStore.java">org/apache/hadoop/hbase/regionserver/TestHStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>166</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>247</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>476</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>514</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ColumnFamilyDescriptorBuilder' has incorrect indentation level 4, expected level should be 6.</td>
 <td>545</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>569</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>608</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>756</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>768</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>797</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>798</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>799</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>800</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>817</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>957</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1471</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1472</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 23 should have line break after.</td>
 <td>1862</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 30 should have line break after.</td>
 <td>1865</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 39 should have line break after.</td>
 <td>1868</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 35 should have line break after.</td>
 <td>1871</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 31 should have line break after.</td>
 <td>1874</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 35 should have line break after.</td>
 <td>1877</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 37 should have line break after.</td>
 <td>1886</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 49 should have line break after.</td>
 <td>1889</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 54 should have line break after.</td>
 <td>1892</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 65 should have line break after.</td>
 <td>1895</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 47 should have line break after.</td>
 <td>1898</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 47 should have line break after.</td>
 <td>1901</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 25 should have line break after.</td>
 <td>1904</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 29 should have line break after.</td>
 <td>1907</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 40 should have line break after.</td>
 <td>1910</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 43 should have line break after.</td>
 <td>1913</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 32 should have line break after.</td>
 <td>1916</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 34 should have line break after.</td>
 <td>1919</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 38 should have line break after.</td>
 <td>1922</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 43 should have line break after.</td>
 <td>1925</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 52 should have line break after.</td>
 <td>1928</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>1931</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -54171,13 +54113,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestJoinedScanners.java">org/apache/hadoop/hbase/regionserver/TestJoinedScanners.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -54186,13 +54128,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestKeyValueScanFixture.java">org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -54201,13 +54143,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestLogRoller.java">org/apache/hadoop/hbase/regionserver/TestLogRoller.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -54216,31 +54158,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMajorCompaction.java">org/apache/hadoop/hbase/regionserver/TestMajorCompaction.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>163</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>440</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>495</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -54249,13 +54191,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMasterAddressTracker.java">org/apache/hadoop/hbase/regionserver/TestMasterAddressTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -54264,25 +54206,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMetricsRegion.java">org/apache/hadoop/hbase/regionserver/TestMetricsRegion.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>104</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -54291,19 +54233,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMetricsRegionServer.java">org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -54312,37 +54254,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMultiColumnScanner.java">org/apache/hadoop/hbase/regionserver/TestMultiColumnScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 56.</td>
 <td>99</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>161</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>183</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -54351,13 +54293,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMultiVersionConcurrencyControl.java">org/apache/hadoop/hbase/regionserver/TestMultiVersionConcurrencyControl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -54366,19 +54308,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestNotCleanupCompactedFileWhenRegionWarmup.java">org/apache/hadoop/hbase/regionserver/TestNotCleanupCompactedFileWhenRegionWarmup.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.ArrayList' import.</td>
 <td>46</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -54387,76 +54329,76 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestPerColumnFamilyFlush.java">org/apache/hadoop/hbase/regionserver/TestPerColumnFamilyFlush.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>487</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
-<td>488</td></tr>
+<td>487</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
+<td>488</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 106).</td>
 <td>489</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRSKilledWhenInitializing.java">org/apache/hadoop/hbase/regionserver/TestRSKilledWhenInitializing.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>132</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>136</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -54465,43 +54407,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionIncrement.java">org/apache/hadoop/hbase/regionserver/TestRegionIncrement.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>177</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>197</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>200</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>230</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -54510,49 +54452,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionMergeTransactionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>159</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>396</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>399</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 140).</td>
 <td>401</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 139).</td>
 <td>402</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 146).</td>
 <td>403</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -54561,13 +54503,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionOpen.java">org/apache/hadoop/hbase/regionserver/TestRegionOpen.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -54576,19 +54518,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionReplicaFailover.java">org/apache/hadoop/hbase/regionserver/TestRegionReplicaFailover.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 52, 53.</td>
 <td>74</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -54597,19 +54539,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionReplicasWithRestartScenarios.java">org/apache/hadoop/hbase/regionserver/TestRegionReplicasWithRestartScenarios.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>50</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -54618,13 +54560,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerAbort.java">org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -54633,43 +54575,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerHostname.java">org/apache/hadoop/hbase/regionserver/TestRegionServerHostname.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>136</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>170</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 118).</td>
 <td>173</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>195</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -54678,31 +54620,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerMetrics.java">org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.junit.Assert.assertNotEquals.</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>175</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
 <td>570</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -54711,31 +54653,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerNoMaster.java">org/apache/hadoop/hbase/regionserver/TestRegionServerNoMaster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>133</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>293</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>298</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -54744,26 +54686,26 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerOnlineConfigChange.java">org/apache/hadoop/hbase/regionserver/TestRegionServerOnlineConfigChange.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>105</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>131</td></tr>
+<td>105</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>131</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
@@ -54771,13 +54713,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerReadRequestMetrics.java">org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -54786,19 +54728,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerReportForDuty.java">org/apache/hadoop/hbase/regionserver/TestRegionServerReportForDuty.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>173</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -54807,43 +54749,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestResettingCounters.java">org/apache/hadoop/hbase/regionserver/TestResettingCounters.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>108</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -54852,97 +54794,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestReversibleScanners.java">org/apache/hadoop/hbase/regionserver/TestReversibleScanners.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 65.</td>
 <td>175</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>209</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>219</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>236</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 65.</td>
 <td>265</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>275</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>353</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>359</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>449</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>583</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>609</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>610</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>628</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -54951,13 +54893,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRowTooBig.java">org/apache/hadoop/hbase/regionserver/TestRowTooBig.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -54966,19 +54908,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestScanWithBloomError.java">org/apache/hadoop/hbase/regionserver/TestScanWithBloomError.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>159</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -54987,70 +54929,70 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestScannerHeartbeatMessages.java">org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>595</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>597</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>614</td></tr>
+<td>597</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>614</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>616</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestScannerRPCScanMetrics.java">org/apache/hadoop/hbase/regionserver/TestScannerRPCScanMetrics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.junit.Assert.assertTrue.</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.client.TestClientScannerRPCTimeout.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>47</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 5 should be on the previous line.</td>
 <td>129</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
@@ -55059,13 +55001,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestScannerRetriableFailure.java">org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -55074,19 +55016,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestScannerWithBulkload.java">org/apache/hadoop/hbase/regionserver/TestScannerWithBulkload.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>187</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -55095,19 +55037,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestSeekOptimizations.java">org/apache/hadoop/hbase/regionserver/TestSeekOptimizations.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>354</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
@@ -55116,19 +55058,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestServerNonceManager.java">org/apache/hadoop/hbase/regionserver/TestServerNonceManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>232</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -55137,13 +55079,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestSettingTimeoutOnBlockingPoint.java">org/apache/hadoop/hbase/regionserver/TestSettingTimeoutOnBlockingPoint.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -55152,43 +55094,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestSplitLogWorker.java">org/apache/hadoop/hbase/regionserver/TestSplitLogWorker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>124</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>130</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'finally' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>209</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -55197,130 +55139,130 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestSplitTransactionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>450</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>664</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>690</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>913</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>914</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>915</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>916</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>920</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ZooKeeperConnectionException' has incorrect indentation level 2, expected level should be 4.</td>
 <td>921</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>951</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>969</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>970</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>972</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>978</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>979</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1021</td></tr>
+<td>979</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1021</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>1065</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestTags.java">org/apache/hadoop/hbase/regionserver/TestTags.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>234</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -55329,19 +55271,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint.java">org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -55350,25 +55292,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestWALLockup.java">org/apache/hadoop/hbase/regionserver/TestWALLockup.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>148</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>258</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -55377,13 +55319,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestWALMonotonicallyIncreasingSeqId.java">org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -55392,55 +55334,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestWalAndCompactingMemStoreFlush.java">org/apache/hadoop/hbase/regionserver/TestWalAndCompactingMemStoreFlush.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 230 lines (max allowed is 150).</td>
 <td>138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 254 lines (max allowed is 150).</td>
 <td>372</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>888</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>890</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>892</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>895</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>999</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -55449,19 +55391,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TimeRangeTracker.java">org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>188</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -55470,13 +55412,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.CompactionConfiguration.java">org/apache/hadoop/hbase/regionserver/compactions/CompactionConfiguration.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -55485,25 +55427,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.CompactionProgress.java">org/apache/hadoop/hbase/regionserver/compactions/CompactionProgress.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'currentCompactedKVs' must be private and have accessor methods.</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'totalCompactedSize' must be private and have accessor methods.</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -55512,13 +55454,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest.java">org/apache/hadoop/hbase/regionserver/compactions/CompactionRequest.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -55527,13 +55469,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.CompactionRequester.java">org/apache/hadoop/hbase/regionserver/compactions/CompactionRequester.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -55542,73 +55484,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.Compactor.java">org/apache/hadoop/hbase/regionserver/compactions/Compactor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'maxKeyCount' must be private and have accessor methods.</td>
 <td>121</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'earliestPutTs' must be private and have accessor methods.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'latestPutTs' must be private and have accessor methods.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'maxSeqId' must be private and have accessor methods.</td>
 <td>127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'maxMVCCReadpoint' must be private and have accessor methods.</td>
 <td>129</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'maxTagsLength' must be private and have accessor methods.</td>
 <td>131</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'minSeqIdToKeep' must be private and have accessor methods.</td>
 <td>133</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>200</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>207</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -55617,13 +55559,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.CurrentHourProvider.java">org/apache/hadoop/hbase/regionserver/compactions/CurrentHourProvider.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -55632,37 +55574,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.DefaultCompactor.java">org/apache/hadoop/hbase/regionserver/compactions/DefaultCompactor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>56</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
 <td>57</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 2, 4.</td>
 <td>58</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -55671,25 +55613,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours.java">org/apache/hadoop/hbase/regionserver/compactions/OffPeakHours.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 46 should have line break after.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -55698,82 +55640,82 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.PerfTestCompactionPolicies.java">org/apache/hadoop/hbase/regionserver/compactions/PerfTestCompactionPolicies.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>83</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>84</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>85</td></tr>
+<td>84</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>85</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
 <td>'array initialization rcurly' has incorrect indentation level 5, expected level should be one of the following: 4, 6.</td>
 <td>86</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.RatioBasedCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/compactions/RatioBasedCompactionPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -55782,13 +55724,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.SortedCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/compactions/SortedCompactionPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -55797,13 +55739,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.SpikyFileListGenerator.java">org/apache/hadoop/hbase/regionserver/compactions/SpikyFileListGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -55812,68 +55754,68 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.StripeCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/compactions/StripeCompactionPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>135</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>145</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>153</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>301</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>320</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>326</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>369</td></tr>
+<td>326</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>369</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
@@ -55881,13 +55823,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.StripeCompactor.java">org/apache/hadoop/hbase/regionserver/compactions/StripeCompactor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -55896,19 +55838,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.TestCompactor.java">org/apache/hadoop/hbase/regionserver/compactions/TestCompactor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>58</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -55917,13 +55859,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.handler.OpenPriorityRegionHandler.java">org/apache/hadoop/hbase/regionserver/handler/OpenPriorityRegionHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -55932,19 +55874,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.java">org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>66</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -55953,13 +55895,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.handler.ParallelSeekHandler.java">org/apache/hadoop/hbase/regionserver/handler/ParallelSeekHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -55968,139 +55910,139 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.handler.WALSplitterHandler.java">org/apache/hadoop/hbase/regionserver/handler/WALSplitterHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Server' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 10.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>86</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>87</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>89</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 10.</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>95</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>97</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>99</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -56109,46 +56051,46 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ColumnTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/ColumnTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ShipperListener' import.</td>
 <td>25</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>117</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>125</td></tr>
+<td>117</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>125</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>134</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.CompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/CompactionScanQueryMatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56157,13 +56099,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56172,13 +56114,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.DropDeletesCompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/DropDeletesCompactionScanQueryMatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56187,13 +56129,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ExplicitColumnTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/ExplicitColumnTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56202,13 +56144,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.IncludeAllCompactionQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/IncludeAllCompactionQueryMatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56217,13 +56159,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.MajorCompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/MajorCompactionScanQueryMatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56232,13 +56174,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.MinorCompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/MinorCompactionScanQueryMatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56247,127 +56189,127 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.NewVersionBehaviorTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/NewVersionBehaviorTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValue.Type' import.</td>
 <td>34</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher.MatchCode' import.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'ts' must be private and have accessor methods.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'mvcc' must be private and have accessor methods.</td>
 <td>111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>165</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>200</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>201</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>203</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>204</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>205</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>206</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>209</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>210</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>213</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>214</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>215</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>216</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>217</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -56376,19 +56318,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.NormalUserScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/NormalUserScanQueryMatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeepDeletedCells' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56397,13 +56339,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.RawScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/RawScanQueryMatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56412,13 +56354,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ScanDeleteTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/ScanDeleteTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56427,43 +56369,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>143</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>144</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>276</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>304</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>322</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -56472,19 +56414,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ScanWildcardColumnTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/ScanWildcardColumnTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValueUtil' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56493,13 +56435,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.StripeCompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56508,13 +56450,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.TestExplicitColumnTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/TestExplicitColumnTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -56523,13 +56465,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.TestNewVersionBehaviorTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/TestNewVersionBehaviorTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56538,13 +56480,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.TestScanDeleteTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/TestScanDeleteTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -56553,124 +56495,124 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.TestUserScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/TestUserScanQueryMatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>166</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 45.</td>
 <td>173</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 45.</td>
 <td>174</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 45.</td>
 <td>175</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 45.</td>
 <td>176</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
 <td>185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
 <td>186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
 <td>187</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
 <td>188</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
 <td>189</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>210</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
 <td>229</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
 <td>230</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
-<td>231</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
-<td>232</td></tr>
+<td>231</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
+<td>232</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
 <td>233</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.UserScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/UserScanQueryMatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValueUtil' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56679,19 +56621,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.snapshot.FlushSnapshotSubprocedure.java">org/apache/hadoop/hbase/regionserver/snapshot/FlushSnapshotSubprocedure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.IsolationLevel' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56700,127 +56642,127 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.snapshot.RegionServerSnapshotManager.java">org/apache/hadoop/hbase/regionserver/snapshot/RegionServerSnapshotManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.RegionReplicaUtil' import.</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.snapshot.SnapshotCreationException' import.</td>
 <td>57</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>95</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>131</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>152</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>187</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>188</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>190</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>192</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>205</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>206</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>220</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>223</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>312</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>357</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>372</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -56829,13 +56771,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.throttle.CompactionThroughputControllerFactory.java">org/apache/hadoop/hbase/regionserver/throttle/CompactionThroughputControllerFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56844,13 +56786,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.throttle.FlushThroughputControllerFactory.java">org/apache/hadoop/hbase/regionserver/throttle/FlushThroughputControllerFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56859,13 +56801,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/NoLimitThroughputController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56874,13 +56816,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.throttle.PressureAwareCompactionThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/PressureAwareCompactionThroughputController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56889,13 +56831,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.throttle.PressureAwareFlushThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/PressureAwareFlushThroughputController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56904,19 +56846,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.throttle.PressureAwareThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/PressureAwareThroughputController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -56925,13 +56867,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.throttle.ThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/ThroughputController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -56940,13 +56882,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.java">org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
@@ -56955,13 +56897,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractProtobufLogWriter.java">org/apache/hadoop/hbase/regionserver/wal/AbstractProtobufLogWriter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -56970,52 +56912,52 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractTestFSWAL.java">org/apache/hadoop/hbase/regionserver/wal/AbstractTestFSWAL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>206</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>264</td></tr>
+<td>206</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>264</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>409</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractTestLogRolling.java">org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRolling.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>201</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>298</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -57024,19 +56966,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractTestProtobufLog.java">org/apache/hadoop/hbase/regionserver/wal/AbstractTestProtobufLog.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -57045,13 +56987,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay.java">org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -57060,25 +57002,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.AsyncFSWAL.java">org/apache/hadoop/hbase/regionserver/wal/AsyncFSWAL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 4.</td>
 <td>651</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>652</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -57087,19 +57029,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.AsyncProtobufLogWriter.java">org/apache/hadoop/hbase/regionserver/wal/AsyncProtobufLogWriter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>255</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -57108,13 +57050,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.CompressionContext.java">org/apache/hadoop/hbase/regionserver/wal/CompressionContext.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -57123,55 +57065,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.Compressor.java">org/apache/hadoop/hbase/regionserver/wal/Compressor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.wal.WAL' import.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td>105</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td>142</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
@@ -57180,73 +57122,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.FSHLog.java">org/apache/hadoop/hbase/regionserver/wal/FSHLog.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>111</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>121</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>249</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>278</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>569</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>795</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>872</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>874</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>1059</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -57255,13 +57197,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.FailedLogCloseException.java">org/apache/hadoop/hbase/regionserver/wal/FailedLogCloseException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -57270,13 +57212,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.FailedSyncBeforeLogCloseException.java">org/apache/hadoop/hbase/regionserver/wal/FailedSyncBeforeLogCloseException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -57285,43 +57227,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.InstrumentedLogWriter.java">org/apache/hadoop/hbase/regionserver/wal/InstrumentedLogWriter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 4.</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -57330,127 +57272,127 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.ProtobufLogReader.java">org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.fs.FileSystem' import.</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.fs.FSDataInputStream' import.</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>187</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>192</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>193</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 5, expected level should be 4.</td>
 <td>193</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 5, expected level should be 4.</td>
 <td>194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>196</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>197</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>198</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 5, expected level should be 4.</td>
 <td>199</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>200</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>201</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 194).</td>
 <td>238</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>261</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -57459,13 +57401,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.ReaderBase.java">org/apache/hadoop/hbase/regionserver/wal/ReaderBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -57474,19 +57416,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogReader.java">org/apache/hadoop/hbase/regionserver/wal/SecureProtobufLogReader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.fs.FSDataInputStream' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -57495,13 +57437,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogWriter.java">org/apache/hadoop/hbase/regionserver/wal/SecureProtobufLogWriter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -57510,19 +57452,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.SecureWALCellCodec.java">org/apache/hadoop/hbase/regionserver/wal/SecureWALCellCodec.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -57531,82 +57473,82 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.SequenceIdAccounting.java">org/apache/hadoop/hbase/regionserver/wal/SequenceIdAccounting.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>112</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>153</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>165</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>166</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>167</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>288</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>289</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>290</td></tr>
+<td>289</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>290</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>291</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.TestAsyncFSWAL.java">org/apache/hadoop/hbase/regionserver/wal/TestAsyncFSWAL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -57615,13 +57557,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.TestAsyncWALReplay.java">org/apache/hadoop/hbase/regionserver/wal/TestAsyncWALReplay.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -57630,31 +57572,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.TestLogRolling.java">org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 174 lines (max allowed is 150).</td>
 <td>107</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>422</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>528</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -57663,31 +57605,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.TestLogRollingNoCluster.java">org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -57696,19 +57638,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.TestWALConfiguration.java">org/apache/hadoop/hbase/regionserver/wal/TestWALConfiguration.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -57717,19 +57659,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.WALActionsListener.java">org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -57738,38 +57680,38 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.WALCellCodec.java">org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.codec.BaseDecoder' import.</td>
 <td>32</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>107</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>125</td></tr>
+<td>107</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
+<td>125</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
@@ -57777,13 +57719,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.WALCoprocessorHost.java">org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -57792,13 +57734,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.wal.WALUtil.java">org/apache/hadoop/hbase/regionserver/wal/WALUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -57807,25 +57749,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.BaseReplicationEndpoint.java">org/apache/hadoop/hbase/replication/BaseReplicationEndpoint.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>62</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -57834,13 +57776,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.BulkLoadCellFilter.java">org/apache/hadoop/hbase/replication/BulkLoadCellFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -57849,25 +57791,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.ClusterMarkingEntryFilter.java">org/apache/hadoop/hbase/replication/ClusterMarkingEntryFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.wal.WALEdit' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.wal.WAL.Entry' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -57876,19 +57818,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint.java">org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Abortable' import.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -57897,25 +57839,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.ReplicationEndpoint.java">org/apache/hadoop/hbase/replication/ReplicationEndpoint.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.replication.regionserver.MetricsSource' import.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -57924,13 +57866,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.ReplicationException.java">org/apache/hadoop/hbase/replication/ReplicationException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -57939,13 +57881,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.ReplicationPeerConfig.java">org/apache/hadoop/hbase/replication/ReplicationPeerConfig.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -57954,13 +57896,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.ReplicationSinkServiceImpl.java">org/apache/hadoop/hbase/replication/ReplicationSinkServiceImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -57969,43 +57911,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.TestMultiSlaveReplication.java">org/apache/hadoop/hbase/replication/TestMultiSlaveReplication.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>227</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>229</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>230</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
 <td>231</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>283</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -58014,19 +57956,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.TestPerTableCFReplication.java">org/apache/hadoop/hbase/replication/TestPerTableCFReplication.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 1, expected level should be 2.</td>
 <td>277</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -58035,13 +57977,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.TestReplicationDisableInactivePeer.java">org/apache/hadoop/hbase/replication/TestReplicationDisableInactivePeer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -58050,13 +57992,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.TestReplicationKillMasterRSCompressed.java">org/apache/hadoop/hbase/replication/TestReplicationKillMasterRSCompressed.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -58065,13 +58007,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.TestReplicationStatusSink.java">org/apache/hadoop/hbase/replication/TestReplicationStatusSink.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -58080,46 +58022,46 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.TestVerifyReplicationAdjunct.java">org/apache/hadoop/hbase/replication/TestVerifyReplicationAdjunct.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
-<td>269</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
-<td>274</td></tr>
+<td>269</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
+<td>274</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
 <td>275</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.WALCellFilter.java">org/apache/hadoop/hbase/replication/WALCellFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.wal.WAL.Entry' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -58128,13 +58070,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.WALEntryFilter.java">org/apache/hadoop/hbase/replication/WALEntryFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -58143,19 +58085,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner.java">org/apache/hadoop/hbase/replication/master/ReplicationLogCleaner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -58164,44 +58106,44 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.regionserver.DumpReplicationQueues.java">org/apache/hadoop/hbase/replication/regionserver/DumpReplicationQueues.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>68</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>101</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>109</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>151</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>152</td></tr>
+<td>151</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>152</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
@@ -58209,19 +58151,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.regionserver.MetricsSink.java">org/apache/hadoop/hbase/replication/regionserver/MetricsSink.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -58230,19 +58172,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationLoad.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationLoad.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.ArrayList' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -58251,13 +58193,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationSink.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationSink.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -58266,13 +58208,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceManager.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -58281,13 +58223,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceShipper.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -58296,19 +58238,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationThrottler.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationThrottler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.EnvironmentEdgeManager' import.</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -58317,52 +58259,52 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.regionserver.TestGlobalReplicationThrottler.java">org/apache/hadoop/hbase/replication/regionserver/TestGlobalReplicationThrottler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>147</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td>148</td></tr>
+<td>147</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>148</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>149</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.regionserver.TestRefreshRecoveredReplication.java">org/apache/hadoop/hbase/replication/regionserver/TestRefreshRecoveredReplication.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Collection.</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.stream.Collectors.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -58371,73 +58313,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.regionserver.TestReplicationSink.java">org/apache/hadoop/hbase/replication/regionserver/TestReplicationSink.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>140</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>149</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>159</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>177</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>239</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>246</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>265</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>293</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>445</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -58446,13 +58388,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.regionserver.TestWALEntrySinkFilter.java">org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -58461,13 +58403,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.replication.regionserver.WALEntrySinkFilter.java">org/apache/hadoop/hbase/replication/regionserver/WALEntrySinkFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -58476,25 +58418,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.ExistsResource.java">org/apache/hadoop/hbase/rest/ExistsResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'javax.ws.rs.core.Response.ResponseBuilder' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -58503,25 +58445,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.MetricsREST.java">org/apache/hadoop/hbase/rest/MetricsREST.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>RedundantImport</td>
 <td>Redundant import from the same package - org.apache.hadoop.hbase.rest.MetricsRESTSource.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -58530,73 +58472,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.MultiRowResource.java">org/apache/hadoop/hbase/rest/MultiRowResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>51</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>52</td></tr>
+<td>51</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>52</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>53</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.NamespacesInstanceResource.java">org/apache/hadoop/hbase/rest/NamespacesInstanceResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>66</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>74</td></tr>
+<td>66</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>74</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>87</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.NamespacesResource.java">org/apache/hadoop/hbase/rest/NamespacesResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.rest.model.NamespacesModel' import.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -58605,13 +58547,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.ProtobufMessageHandler.java">org/apache/hadoop/hbase/rest/ProtobufMessageHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -58620,43 +58562,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.RESTServer.java">org/apache/hadoop/hbase/rest/RESTServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'conf' must be private and have accessor methods.</td>
 <td>109</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>240</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 154 lines (max allowed is 150).</td>
 <td>253</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>278</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>280</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -58665,37 +58607,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.RESTServlet.java">org/apache/hadoop/hbase/rest/RESTServlet.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>97</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>155</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -58704,13 +58646,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.RESTServletContainer.java">org/apache/hadoop/hbase/rest/RESTServletContainer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -58719,19 +58661,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.RegionsResource.java">org/apache/hadoop/hbase/rest/RegionsResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -58740,25 +58682,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.RootResource.java">org/apache/hadoop/hbase/rest/RootResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'javax.ws.rs.core.Response.ResponseBuilder' import.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -58767,319 +58709,319 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.RowResource.java">org/apache/hadoop/hbase/rest/RowResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>227</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>228</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 10, expected level should be 12.</td>
 <td>229</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>230</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 10, expected level should be 12.</td>
 <td>231</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>267</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>268</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>269</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>270</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>271</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>313</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>338</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>339</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>340</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>341</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>342</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>403</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>405</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>444</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>445</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>446</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>447</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>448</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>561</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>562</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>563</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>564</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>565</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>691</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>692</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>693</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>694</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>695</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>714</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>785</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>786</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>787</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>788</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>789</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>808</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>848</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>882</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>883</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>884</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>885</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -59088,181 +59030,181 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.RowSpec.java">org/apache/hadoop/hbase/rest/RowSpec.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>237</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>238</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'while' has incorrect indentation level 8, expected level should be 10.</td>
 <td>239</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'while' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>240</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 10, expected level should be 12.</td>
 <td>241</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>242</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>243</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be 12.</td>
 <td>244</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'while' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>245</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'while rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>246</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>247</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>248</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>249</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>250</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'while' has incorrect indentation level 8, expected level should be 10.</td>
 <td>251</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'while' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>252</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 10, expected level should be 12.</td>
 <td>253</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>254</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>255</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be 12.</td>
 <td>256</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'while' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>257</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'while rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>258</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>259</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>260</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>261</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -59271,13 +59213,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.ScannerInstanceResource.java">org/apache/hadoop/hbase/rest/ScannerInstanceResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -59286,31 +59228,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.ScannerResource.java">org/apache/hadoop/hbase/rest/ScannerResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.fasterxml.jackson.core.JsonParseException' import.</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'Collections' has incorrect indentation level 3, expected level should be 4.</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -59319,19 +59261,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.ScannerResultGenerator.java">org/apache/hadoop/hbase/rest/ScannerResultGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -59340,13 +59282,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.StorageClusterStatusResource.java">org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -59355,13 +59297,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.StorageClusterVersionResource.java">org/apache/hadoop/hbase/rest/StorageClusterVersionResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -59370,46 +59312,46 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.TableResource.java">org/apache/hadoop/hbase/rest/TableResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
 <td>35</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>51</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>52</td></tr>
+<td>51</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>52</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>66</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.TableScanResource.java">org/apache/hadoop/hbase/rest/TableScanResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -59418,13 +59360,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.TestRESTServerSSL.java">org/apache/hadoop/hbase/rest/TestRESTServerSSL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -59433,13 +59375,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.TestScannersWithLabels.java">org/apache/hadoop/hbase/rest/TestScannersWithLabels.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -59448,19 +59390,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.TestSecureRESTServer.java">org/apache/hadoop/hbase/rest/TestSecureRESTServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>346</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -59469,25 +59411,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.VersionResource.java">org/apache/hadoop/hbase/rest/VersionResource.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'javax.ws.rs.core.Response.ResponseBuilder' import.</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.rest.model.VersionModel' import.</td>
 <td>37</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -59496,832 +59438,832 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.client.Client.java">org/apache/hadoop/hbase/rest/client/Client.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.io.FileInputStream.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>267</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>322</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>336</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>362</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>424</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>436</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>453</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>464</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>475</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>487</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>502</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>520</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>525</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>553</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>572</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>586</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>634</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>637</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>649</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>652</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>674</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>688</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>736</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>739</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>751</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>754</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>774</td></tr>
+<td>754</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>774</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>785</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.client.RemoteAdmin.java">org/apache/hadoop/hbase/rest/client/RemoteAdmin.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>62</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>125</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>127</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>128</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>129</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>130</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>131</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' has incorrect indentation level 8, expected level should be 10.</td>
 <td>132</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>133</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>135</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>136</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>137</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>139</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>148</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>152</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>153</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 4.</td>
 <td>154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 6.</td>
 <td>155</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 6.</td>
 <td>156</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>157</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>167</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>168</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>169</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>171</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>172</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>173</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' has incorrect indentation level 8, expected level should be 10.</td>
 <td>174</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>175</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>176</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>177</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>178</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>180</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>181</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>209</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' has incorrect indentation level 8, expected level should be 10.</td>
 <td>210</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>214</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>216</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>219</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>220</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>221</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>222</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' has incorrect indentation level 8, expected level should be 10.</td>
 <td>223</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>224</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>225</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>226</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>227</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>228</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>229</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>230</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>257</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>258</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>259</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>260</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>261</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' has incorrect indentation level 8, expected level should be 10.</td>
 <td>262</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>263</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>264</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>265</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>267</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>268</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>269</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>298</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>299</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>300</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' has incorrect indentation level 8, expected level should be 10.</td>
 <td>301</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>302</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>303</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>304</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>305</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>306</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>307</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>308</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>343</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>344</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>345</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' has incorrect indentation level 8, expected level should be 10.</td>
 <td>346</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>347</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>348</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>349</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>350</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>351</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>352</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>353</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>382</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>383</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>384</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>385</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>386</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>387</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' has incorrect indentation level 8, expected level should be 10.</td>
 <td>388</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>389</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>390</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>391</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>392</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>393</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>394</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -60330,13 +60272,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.client.TestRemoteTable.java">org/apache/hadoop/hbase/rest/client/TestRemoteTable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -60345,112 +60287,112 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.model.CellModel.java">org/apache/hadoop/hbase/rest/model/CellModel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>87</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>97</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>105</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>115</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>127</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>128</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>129</td></tr>
+<td>128</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>129</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>154</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.model.CellSetModel.java">org/apache/hadoop/hbase/rest/model/CellSetModel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations' import.</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -60459,37 +60401,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.model.NamespacesInstanceModel.java">org/apache/hadoop/hbase/rest/model/NamespacesInstanceModel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 23 should have line break after.</td>
 <td>86</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -60498,25 +60440,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.model.NamespacesModel.java">org/apache/hadoop/hbase/rest/model/NamespacesModel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
 <td>34</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.fasterxml.jackson.annotation.JsonProperty' import.</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -60525,751 +60467,751 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.model.ScannerModel.java">org/apache/hadoop/hbase/rest/model/ScannerModel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.ByteString' import.</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.fasterxml.jackson.annotation.JsonInclude' import.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'type' must be private and have accessor methods.</td>
 <td>136</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'value' must be private and have accessor methods.</td>
 <td>137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'op' must be private and have accessor methods.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'type' must be private and have accessor methods.</td>
 <td>208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'op' must be private and have accessor methods.</td>
 <td>209</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'value' must be private and have accessor methods.</td>
 <td>211</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'filters' must be private and have accessor methods.</td>
 <td>212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'limit' must be private and have accessor methods.</td>
 <td>213</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'offset' must be private and have accessor methods.</td>
 <td>214</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'family' must be private and have accessor methods.</td>
 <td>215</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'qualifier' must be private and have accessor methods.</td>
 <td>216</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'ifMissing' must be private and have accessor methods.</td>
 <td>217</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'latestVersion' must be private and have accessor methods.</td>
 <td>218</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'minColumn' must be private and have accessor methods.</td>
 <td>219</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'minColumnInclusive' must be private and have accessor methods.</td>
 <td>220</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'maxColumn' must be private and have accessor methods.</td>
 <td>221</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'maxColumnInclusive' must be private and have accessor methods.</td>
 <td>222</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'dropDependentColumn' must be private and have accessor methods.</td>
 <td>223</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'chance' must be private and have accessor methods.</td>
 <td>224</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'prefixes' must be private and have accessor methods.</td>
 <td>225</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'timestamps' must be private and have accessor methods.</td>
 <td>227</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>354</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>375</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>376</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>377</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>378</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>379</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>380</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>381</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>382</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>383</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>384</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>385</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>388</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>389</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>390</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>393</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>394</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>395</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>396</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>397</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>398</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 8, expected level should be 10.</td>
 <td>399</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>400</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>401</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>402</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>403</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>404</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>405</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>406</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>407</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>408</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>409</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>410</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>411</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>412</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>413</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>414</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 8, expected level should be 10.</td>
 <td>415</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>416</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>417</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>418</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>419</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>420</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>421</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
 <td>422</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>423</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>424</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>425</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>426</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>427</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>428</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>429</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>430</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>431</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>432</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>433</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>434</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>435</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>436</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>437</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>438</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>439</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 10.</td>
 <td>442</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>443</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>444</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 10.</td>
 <td>445</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>446</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>447</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>448</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>449</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>450</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 10.</td>
 <td>453</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>454</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>455</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 10.</td>
 <td>456</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>457</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>458</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>459</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>460</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>461</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>462</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>463</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>464</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>465</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>466</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>467</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>468</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>469</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>470</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>471</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>472</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>473</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>492</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>503</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>514</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>579</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>602</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>604</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>777</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -61278,19 +61220,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.model.StorageClusterStatusModel.java">org/apache/hadoop/hbase/rest/model/StorageClusterStatusModel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations' import.</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61299,25 +61241,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.model.TableInfoModel.java">org/apache/hadoop/hbase/rest/model/TableInfoModel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.rest.ProtobufMessageHandler' import.</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations' import.</td>
 <td>37</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -61326,13 +61268,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.model.TableListModel.java">org/apache/hadoop/hbase/rest/model/TableListModel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61341,13 +61283,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.model.TableModel.java">org/apache/hadoop/hbase/rest/model/TableModel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -61356,13 +61298,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.model.TableRegionModel.java">org/apache/hadoop/hbase/rest/model/TableRegionModel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -61371,19 +61313,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.model.TestScannerModel.java">org/apache/hadoop/hbase/rest/model/TestScannerModel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 117).</td>
 <td>58</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -61392,13 +61334,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.model.VersionModel.java">org/apache/hadoop/hbase/rest/model/VersionModel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -61407,13 +61349,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.provider.JAXBContextResolver.java">org/apache/hadoop/hbase/rest/provider/JAXBContextResolver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61422,13 +61364,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.provider.consumer.ProtobufMessageBodyConsumer.java">org/apache/hadoop/hbase/rest/provider/consumer/ProtobufMessageBodyConsumer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61437,13 +61379,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rest.provider.producer.PlainTextMessageBodyProducer.java">org/apache/hadoop/hbase/rest/provider/producer/PlainTextMessageBodyProducer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61452,13 +61394,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rsgroup.RSGroupInfoManager.java">org/apache/hadoop/hbase/rsgroup/RSGroupInfoManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -61467,19 +61409,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rsgroup.RSGroupInfoManagerImpl.java">org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'rs' has incorrect indentation level 4, expected level should be 6.</td>
 <td>964</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -61488,13 +61430,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rsgroup.TestRSGroupMajorCompactionTTL.java">org/apache/hadoop/hbase/rsgroup/TestRSGroupMajorCompactionTTL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -61503,19 +61445,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.rsgroup.VerifyingRSGroupAdmin.java">org/apache/hadoop/hbase/rsgroup/VerifyingRSGroupAdmin.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.LogEntry' import.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61524,19 +61466,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.AbstractHBaseSaslRpcClient.java">org/apache/hadoop/hbase/security/AbstractHBaseSaslRpcClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>56</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -61545,13 +61487,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.AccessDeniedException.java">org/apache/hadoop/hbase/security/AccessDeniedException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -61560,19 +61502,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.AuthMethod.java">org/apache/hadoop/hbase/security/AuthMethod.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.security.UserGroupInformation' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
@@ -61581,19 +61523,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.CryptoAESUnwrapHandler.java">org/apache/hadoop/hbase/security/CryptoAESUnwrapHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61602,19 +61544,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.CryptoAESWrapHandler.java">org/apache/hadoop/hbase/security/CryptoAESWrapHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61623,46 +61565,46 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.EncryptionUtil.java">org/apache/hadoop/hbase/security/EncryptionUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>68</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>124</td></tr>
+<td>68</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>124</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>125</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.HBasePolicyProvider.java">org/apache/hadoop/hbase/security/HBasePolicyProvider.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61671,37 +61613,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.HBaseSaslRpcClient.java">org/apache/hadoop/hbase/security/HBaseSaslRpcClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.io.WritableUtils' import.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>229</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -61710,13 +61652,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.HadoopSecurityEnabledUserProviderForTesting.java">org/apache/hadoop/hbase/security/HadoopSecurityEnabledUserProviderForTesting.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>RedundantImport</td>
@@ -61725,19 +61667,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.NettyHBaseRpcConnectionHeaderHandler.java">org/apache/hadoop/hbase/security/NettyHBaseRpcConnectionHeaderHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61746,13 +61688,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClient.java">org/apache/hadoop/hbase/security/NettyHBaseSaslRpcClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61761,19 +61703,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.java">org/apache/hadoop/hbase/security/NettyHBaseSaslRpcClientHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61782,19 +61724,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.SaslChallengeDecoder.java">org/apache/hadoop/hbase/security/SaslChallengeDecoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61803,19 +61745,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.SaslStatus.java">org/apache/hadoop/hbase/security/SaslStatus.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -61824,13 +61766,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.SaslUnwrapHandler.java">org/apache/hadoop/hbase/security/SaslUnwrapHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -61839,13 +61781,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.SaslUtil.java">org/apache/hadoop/hbase/security/SaslUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -61854,19 +61796,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.SecurityConstants.java">org/apache/hadoop/hbase/security/SecurityConstants.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -61875,13 +61817,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.SecurityUtil.java">org/apache/hadoop/hbase/security/SecurityUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -61890,13 +61832,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.Superusers.java">org/apache/hadoop/hbase/security/Superusers.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -61905,49 +61847,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.TestSecureIPC.java">org/apache/hadoop/hbase/security/TestSecureIPC.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>247</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>255</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>314</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>344</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>355</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>400</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -61956,13 +61898,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.TestUser.java">org/apache/hadoop/hbase/security/TestUser.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -61971,13 +61913,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.TestUsersOperationsWithSecureHadoop.java">org/apache/hadoop/hbase/security/TestUsersOperationsWithSecureHadoop.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -61986,43 +61928,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.User.java">org/apache/hadoop/hbase/security/User.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>182</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'class def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>295</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>317</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>371</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -62031,316 +61973,316 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.AccessControlClient.java">org/apache/hadoop/hbase/security/access/AccessControlClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>45</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>65</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 118).</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>105</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>106</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>107</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>108</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>109</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>119</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>121</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>125</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>140</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>141</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>142</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>143</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>152</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>153</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>158</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>169</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>171</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>172</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>173</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>174</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>191</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>192</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>193</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>195</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>196</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>209</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>210</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>211</td></tr>
+<td>210</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>211</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>236</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.AccessControlFilter.java">org/apache/hadoop/hbase/security/access/AccessControlFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>168</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -62349,212 +62291,212 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.AccessControlUtil.java">org/apache/hadoop/hbase/security/access/AccessControlUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class AccessControlUtil should be declared as final.</td>
 <td>48</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>392</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>393</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>394</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>395</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>396</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>397</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>398</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>399</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>400</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>401</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>415</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>416</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>417</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>418</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>419</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>420</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>421</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>422</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>423</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>424</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>495</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>500</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>507</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>524</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>552</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>564</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>673</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>704</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>723</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>764</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>780</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>820</td></tr>
+<td>780</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>820</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 4, expected level should be 6.</td>
@@ -62562,127 +62504,127 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.AccessController.java">org/apache/hadoop/hbase/security/access/AccessController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 6.</td>
 <td>298</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>310</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>450</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 166 lines (max allowed is 150).</td>
 <td>452</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>565</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1040</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1137</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1310</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1311</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1312</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1313</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1314</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1315</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1316</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1317</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1318</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1888</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1892</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1902</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -62691,31 +62633,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.AuthResult.java">org/apache/hadoop/hbase/security/access/AuthResult.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 29 should have line break after.</td>
 <td>132</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>296</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -62724,19 +62666,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.Permission.java">org/apache/hadoop/hbase/security/access/Permission.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -62745,25 +62687,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.SecureTestUtil.java">org/apache/hadoop/hbase/security/access/SecureTestUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>71</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -62772,85 +62714,85 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.ShadedAccessControlUtil.java">org/apache/hadoop/hbase/security/access/ShadedAccessControlUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>49</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>82</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>151</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -62859,13 +62801,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.TablePermission.java">org/apache/hadoop/hbase/security/access/TablePermission.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -62874,13 +62816,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.TestAccessControlFilter.java">org/apache/hadoop/hbase/security/access/TestAccessControlFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -62889,73 +62831,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.TestAccessController.java">org/apache/hadoop/hbase/security/access/TestAccessController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 2, expected level should be 4.</td>
 <td>572</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 7, expected level should be one of the following: 8, 10.</td>
 <td>637</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 7, expected level should be one of the following: 8, 10.</td>
 <td>659</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>943</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 243 lines (max allowed is 150).</td>
 <td>1357</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1515</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1607</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 167 lines (max allowed is 150).</td>
 <td>1823</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>2302</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>2528</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -62964,26 +62906,26 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.TestAccessController2.java">org/apache/hadoop/hbase/security/access/TestAccessController2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>EmptyBlock</td>
-<td>Must have at least one statement.</td>
-<td>302</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>328</td></tr>
+<td>302</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>EmptyBlock</td>
+<td>Must have at least one statement.</td>
+<td>328</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
@@ -62991,13 +62933,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.TestCellACLWithMultipleVersions.java">org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -63006,13 +62948,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.TestCellACLs.java">org/apache/hadoop/hbase/security/access/TestCellACLs.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -63021,31 +62963,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.TestHDFSAclHelper.java">org/apache/hadoop/hbase/security/access/TestHDFSAclHelper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.apache.hadoop.hbase.client.*.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.junit.Assert.assertEquals' import.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -63054,19 +62996,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.TestTablePermissions.java">org/apache/hadoop/hbase/security/access/TestTablePermissions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>133</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -63075,19 +63017,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.TestWithDisabledAuthorization.java">org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 165 lines (max allowed is 150).</td>
 <td>242</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -63096,64 +63038,64 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.ZKPermissionWatcher.java">org/apache/hadoop/hbase/security/access/ZKPermissionWatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.Closeable' import.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>236</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>263</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>264</td></tr>
+<td>263</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>264</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>283</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.provider.example.TestShadeSaslAuthenticationProvider.java">org/apache/hadoop/hbase/security/provider/example/TestShadeSaslAuthenticationProvider.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>90</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -63162,19 +63104,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.token.AuthenticationKey.java">org/apache/hadoop/hbase/security/token/AuthenticationKey.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.DataInput' import.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -63183,31 +63125,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager.java">org/apache/hadoop/hbase/security/token/AuthenticationTokenSecretManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -63216,13 +63158,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.token.AuthenticationTokenSelector.java">org/apache/hadoop/hbase/security/token/AuthenticationTokenSelector.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -63231,13 +63173,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.token.SecureTestCluster.java">org/apache/hadoop/hbase/security/token/SecureTestCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -63246,31 +63188,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.token.TestTokenAuthentication.java">org/apache/hadoop/hbase/security/token/TestTokenAuthentication.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda arguments' has incorrect indentation level 10, expected level should be 8.</td>
 <td>267</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>441</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>442</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -63279,52 +63221,52 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.token.TestZKSecretWatcher.java">org/apache/hadoop/hbase/security/token/TestZKSecretWatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>80</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 152 lines (max allowed is 150).</td>
 <td>139</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>189</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>190</td></tr>
+<td>189</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>190</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>191</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.token.TokenProvider.java">org/apache/hadoop/hbase/security/token/TokenProvider.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -63333,13 +63275,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.token.TokenUtil.java">org/apache/hadoop/hbase/security/token/TokenUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -63348,13 +63290,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.token.ZKSecretWatcher.java">org/apache/hadoop/hbase/security/token/ZKSecretWatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -63363,25 +63305,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.CellVisibility.java">org/apache/hadoop/hbase/security/visibility/CellVisibility.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>67</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -63390,55 +63332,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.DefaultVisibilityLabelServiceImpl.java">org/apache/hadoop/hbase/security/visibility/DefaultVisibilityLabelServiceImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>343</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>344</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>386</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>423</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>621</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>633</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>648</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -63447,13 +63389,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.DefinedSetFilterScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/DefinedSetFilterScanLabelGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -63462,13 +63404,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.EnforcingScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/EnforcingScanLabelGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -63477,13 +63419,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.ExpAsStringVisibilityLabelServiceImpl.java">org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -63492,13 +63434,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.ExpressionExpander.java">org/apache/hadoop/hbase/security/visibility/ExpressionExpander.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -63507,73 +63449,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.ExpressionParser.java">org/apache/hadoop/hbase/security/visibility/ExpressionParser.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.security.visibility.expression.ExpressionNode' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>303</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>304</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>305</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>306</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>307</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>308</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>309</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -63582,13 +63524,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.FeedUserAuthScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/FeedUserAuthScanLabelGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -63597,25 +63539,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.LabelFilteringScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/LabelFilteringScanLabelGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -63624,13 +63566,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.LoadTestDataGeneratorWithVisibilityLabels.java">org/apache/hadoop/hbase/security/visibility/LoadTestDataGeneratorWithVisibilityLabels.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -63639,25 +63581,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.ScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/ScanLabelGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -63666,13 +63608,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.SimpleScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/SimpleScanLabelGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -63681,13 +63623,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.TestExpressionExpander.java">org/apache/hadoop/hbase/security/visibility/TestExpressionExpander.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -63696,19 +63638,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.TestExpressionParser.java">org/apache/hadoop/hbase/security/visibility/TestExpressionParser.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 253 lines (max allowed is 150).</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -63717,32 +63659,32 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabels.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabels.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>268</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>381</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>409</td></tr>
+<td>381</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>409</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 28.</td>
@@ -63750,13 +63692,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsOpWithDifferentUsersNoACL.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsOpWithDifferentUsersNoACL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -63765,52 +63707,52 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsReplication.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>121</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>124</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>125</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>127</td></tr>
+<td>125</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>127</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>128</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsWithACL.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsWithACL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -63819,13 +63761,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsWithCustomVisLabService.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsWithCustomVisLabService.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -63834,13 +63776,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsWithDefaultVisLabelService.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsWithDefaultVisLabelService.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -63849,13 +63791,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsWithDeletes.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsWithDeletes.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -63864,13 +63806,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLablesWithGroups.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLablesWithGroups.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -63879,142 +63821,142 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityClient.java">org/apache/hadoop/hbase/security/visibility/VisibilityClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>53</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>71</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>127</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>129</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>140</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>176</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>213</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>214</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>215</td></tr>
+<td>214</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>215</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>217</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityConstants.java">org/apache/hadoop/hbase/security/visibility/VisibilityConstants.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -64023,31 +63965,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityController.java">org/apache/hadoop/hbase/security/visibility/VisibilityController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>238</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>577</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>681</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -64056,13 +63998,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityExpEvaluator.java">org/apache/hadoop/hbase/security/visibility/VisibilityExpEvaluator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -64071,13 +64013,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelFilter.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -64086,19 +64028,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelService.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelService.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -64107,25 +64049,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelServiceManager.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelServiceManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class VisibilityLabelServiceManager should be declared as final.</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -64134,52 +64076,52 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelsCache.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelsCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class VisibilityLabelsCache should be declared as final.</td>
 <td>48</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>79</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>80</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>82</td></tr>
+<td>80</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>82</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>259</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelsValidator.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelsValidator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -64188,97 +64130,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityNewVersionBehaivorTracker.java">org/apache/hadoop/hbase/security/visibility/VisibilityNewVersionBehaivorTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class TagInfo should be declared as final.</td>
 <td>56</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>130</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>131</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>132</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>133</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>136</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>140</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>141</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>142</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>143</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>144</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -64287,13 +64229,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityReplicationEndpoint.java">org/apache/hadoop/hbase/security/visibility/VisibilityReplicationEndpoint.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -64302,43 +64244,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityScanDeleteTracker.java">org/apache/hadoop/hbase/security/visibility/VisibilityScanDeleteTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.regionserver.querymatcher.ScanDeleteTracker' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>130</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 120).</td>
 <td>140</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -64347,13 +64289,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityTestUtil.java">org/apache/hadoop/hbase/security/visibility/VisibilityTestUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -64362,61 +64304,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityUtils.java">org/apache/hadoop/hbase/security/visibility/VisibilityUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>90</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>147</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>149</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>231</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -64425,19 +64367,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.visibility.ZKVisibilityLabelWatcher.java">org/apache/hadoop/hbase/security/visibility/ZKVisibilityLabelWatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -64446,1445 +64388,1445 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil.java">org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>304</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>350</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>420</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>519</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>544</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>545</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>546</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>547</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>548</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>549</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>550</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>551</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>552</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>553</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>554</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>555</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>565</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>566</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>567</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>568</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>569</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>570</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>571</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>572</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>573</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>574</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>575</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>576</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>585</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>588</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>666</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>669</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>679</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>682</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>711</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>781</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>784</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>794</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>797</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 117).</td>
 <td>862</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>880</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>922</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>925</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>945</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>951</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>965</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1015</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1118</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1246</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1317</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1318</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1320</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1334</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1371</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1372</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1373</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1375</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1385</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1386</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1388</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1391</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1415</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1416</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1501</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1503</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1559</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1562</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1582</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1588</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1622</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1679</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1681</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1686</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1687</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1688</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1689</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1690</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1691</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1692</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1693</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1694</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1704</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1709</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1710</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1711</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1712</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1713</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1714</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1715</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1716</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1717</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1718</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1731</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1797</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1798</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1799</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1817</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 130).</td>
 <td>1822</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1836</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1837</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1838</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 124).</td>
 <td>1841</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1856</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1858</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 124).</td>
 <td>1860</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>1870</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1872</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 117).</td>
 <td>1889</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1890</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>1891</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1904</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1922</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1934</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>2147</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>2172</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2220</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2224</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>2265</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2374</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2378</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2385</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2387</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2390</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2405</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2417</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2421</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2428</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2430</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2433</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2448</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2462</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2481</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2500</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2531</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2562</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2576</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2590</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2604</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2735</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2758</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2773</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2788</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2802</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2816</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2817</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2818</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>2957</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>3003</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>3040</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>3052</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>3064</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>3080</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3131</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3144</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>3161</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>3163</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>3164</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>3166</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>3167</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>3168</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
 <td>3169</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>3253</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>3254</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>3255</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>3257</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3258</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>3261</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>3315</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>3330</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>3355</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'.' has incorrect indentation level 4, expected level should be 6.</td>
 <td>3379</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'.' has incorrect indentation level 4, expected level should be 6.</td>
 <td>3380</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
-<td>3381</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'.' has incorrect indentation level 4, expected level should be 6.</td>
-<td>3382</td></tr>
+<td>3381</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'.' has incorrect indentation level 4, expected level should be 6.</td>
+<td>3382</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
 <td>3383</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.shaded.protobuf.RequestConverter.java">org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>200</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>222</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>281</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>282</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>284</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>299</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>300</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>302</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>321</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>322</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>342</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>343</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>345</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>368</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>369</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>370</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>371</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>373</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>394</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>395</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>396</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>413</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>414</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>415</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>416</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>439</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>440</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>441</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>442</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>443</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>444</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>464</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>514</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'org' has incorrect indentation level 9, expected level should be 10.</td>
 <td>555</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>895</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>969</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>970</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>989</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>990</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1009</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1010</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1028</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1029</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1075</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1087</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1112</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1149</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1166</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1183</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1207</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1227</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1341</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1342</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1460</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1516</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1628</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1640</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1652</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1663</td></tr>
+<td>1652</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1663</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
@@ -65892,145 +65834,145 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.shaded.protobuf.ResponseConverter.java">org/apache/hadoop/hbase/shaded/protobuf/ResponseConverter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>97</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>101</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>113</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>258</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>263</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>270</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>275</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>280</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>310</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def lparen' has incorrect indentation level 6, expected level should be 2.</td>
 <td>321</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>321</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>322</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>329</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>330</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>348</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>418</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>435</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>436</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>441</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>460</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 129).</td>
 <td>513</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>514</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -66039,19 +65981,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.slowlog.SlowLogTableAccessor.java">org/apache/hadoop/hbase/slowlog/SlowLogTableAccessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -66060,181 +66002,181 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.CreateSnapshot.java">org/apache/hadoop/hbase/snapshot/CreateSnapshot.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>41</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>44</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>45</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>50</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>57</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>59</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 4.</td>
 <td>62</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 6.</td>
 <td>63</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 6.</td>
 <td>64</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 4.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>66</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>68</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' has incorrect indentation level 8, expected level should be 4.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 6.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 8, expected level should be 4.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 6.</td>
 <td>74</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 6.</td>
 <td>75</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 8, expected level should be 4.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -66243,91 +66185,91 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.ExportSnapshot.java">org/apache/hadoop/hbase/snapshot/ExportSnapshot.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>279</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>280</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>545</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>548</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>552</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>555</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>603</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 44 should have line break after.</td>
 <td>773</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 45 should have line break after.</td>
 <td>776</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 34 should have line break after.</td>
 <td>779</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>807</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>808</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 171 lines (max allowed is 150).</td>
 <td>942</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -66336,44 +66278,44 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.MobSnapshotTestingUtils.java">org/apache/hadoop/hbase/snapshot/MobSnapshotTestingUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>90</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>91</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>93</td></tr>
+<td>91</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>93</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
@@ -66381,154 +66323,154 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.RestoreSnapshotHelper.java">org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>378</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>419</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>434</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>449</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>586</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>642</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>667</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>733</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>827</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>828</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>829</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>830</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>831</td></tr>
+<td>830</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>831</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>832</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.java">org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil.</td>
 <td>50</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>153</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>154</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>155</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>420</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -66537,73 +66479,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.SnapshotInfo.java">org/apache/hadoop/hbase/snapshot/SnapshotInfo.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>127</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>128</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 5 should be on the previous line.</td>
 <td>153</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 40 should have line break after.</td>
 <td>192</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 40 should have line break after.</td>
 <td>230</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>327</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>399</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>462</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>472</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -66612,37 +66554,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.SnapshotManifest.java">org/apache/hadoop/hbase/snapshot/SnapshotManifest.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>352</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>436</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>480</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -66651,13 +66593,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.SnapshotManifestV2.java">org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -66666,163 +66608,163 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils.java">org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>210</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>212</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>222</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>225</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>226</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>227</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 152).</td>
 <td>232</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 158).</td>
 <td>239</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>268</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>422</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>425</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>426</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>427</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>428</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>429</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>430</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>431</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>432</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
 <td>433</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>564</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 14, expected level should be 12.</td>
 <td>578</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>596</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>636</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>646</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>803</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -66831,13 +66773,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.TestExportSnapshot.java">org/apache/hadoop/hbase/snapshot/TestExportSnapshot.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -66846,13 +66788,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.TestFlushSnapshotFromClient.java">org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -66861,19 +66803,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.TestRestoreSnapshotHelper.java">org/apache/hadoop/hbase/snapshot/TestRestoreSnapshotHelper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>210</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -66882,205 +66824,205 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.test.IntegrationTestBigLinkedList.java">org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>318</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>478</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>658</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>673</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 50 should have line break after.</td>
 <td>690</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>717</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>721</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>724</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>934</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1019</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>1021</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>1039</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1053</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>1160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 6, expected level should be 8.</td>
 <td>1161</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1177</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1180</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1194</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1296</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 6, expected level should be 8.</td>
 <td>1300</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1302</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1325</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1328</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>1470</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>1479</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>1539</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1654</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1662</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>1664</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>1724</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -67089,43 +67031,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.test.IntegrationTestBigLinkedListWithVisibility.java">org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>343</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>499</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>535</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -67134,60 +67076,54 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.test.IntegrationTestLoadAndVerify.java">org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 0, expected level should be 2.</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 2, expected level should be 4.</td>
 <td>159</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 2, expected level should be 4.</td>
 <td>160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>161</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 2, expected level should be 4.</td>
 <td>162</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 0, expected level should be 2.</td>
 <td>163</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>172</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>174</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
@@ -67204,7 +67140,7 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
+<td>'(' is followed by whitespace.</td>
 <td>174</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -67222,8 +67158,8 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>175</td></tr>
+<td>')' is preceded with whitespace.</td>
+<td>174</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
@@ -67240,7 +67176,7 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
+<td>'(' is followed by whitespace.</td>
 <td>175</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -67258,8 +67194,8 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>176</td></tr>
+<td>')' is preceded with whitespace.</td>
+<td>175</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
@@ -67276,7 +67212,7 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
+<td>'(' is followed by whitespace.</td>
 <td>176</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -67294,8 +67230,8 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>177</td></tr>
+<td>')' is preceded with whitespace.</td>
+<td>176</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
@@ -67312,7 +67248,7 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
+<td>'(' is followed by whitespace.</td>
 <td>177</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -67330,8 +67266,8 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>178</td></tr>
+<td>')' is preceded with whitespace.</td>
+<td>177</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
@@ -67348,7 +67284,7 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
+<td>'(' is followed by whitespace.</td>
 <td>178</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -67366,8 +67302,8 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>179</td></tr>
+<td>')' is preceded with whitespace.</td>
+<td>178</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
@@ -67384,7 +67320,7 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
+<td>'(' is followed by whitespace.</td>
 <td>179</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -67402,8 +67338,8 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>180</td></tr>
+<td>')' is preceded with whitespace.</td>
+<td>179</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
@@ -67420,7 +67356,7 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
+<td>'(' is followed by whitespace.</td>
 <td>180</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -67438,8 +67374,8 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>181</td></tr>
+<td>')' is preceded with whitespace.</td>
+<td>180</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
@@ -67456,7 +67392,7 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
+<td>'(' is followed by whitespace.</td>
 <td>181</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -67472,95 +67408,101 @@
 <td>181</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>181</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>280</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>471</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>488</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>507</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>509</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>517</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>558</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>559</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>560</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>561</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>562</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>563</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>564</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>565</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -67569,58 +67511,58 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.test.IntegrationTestReplication.java">org/apache/hadoop/hbase/test/IntegrationTestReplication.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Collections' import.</td>
 <td>43</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>181</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>262</td></tr>
+<td>181</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>262</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>286</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.test.IntegrationTestTimeBoundedMultiGetRequestsWithRegionReplicas.java">org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedMultiGetRequestsWithRegionReplicas.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -67629,37 +67571,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.test.IntegrationTestTimeBoundedRequestsWithRegionReplicas.java">org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedRequestsWithRegionReplicas.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>164</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>226</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>342</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>344</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -67668,91 +67610,91 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.test.IntegrationTestWithCellVisibilityLoadAndVerify.java">org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 52.</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 52.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 69.</td>
 <td>143</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>192</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>193</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>195</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>196</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>197</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>198</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>199</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>200</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>201</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -67761,13 +67703,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.thrift.IncrementCoalescer.java">org/apache/hadoop/hbase/thrift/IncrementCoalescer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -67776,19 +67718,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.thrift.TestBindExceptionHandling.java">org/apache/hadoop/hbase/thrift/TestBindExceptionHandling.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -67797,13 +67739,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.thrift.TestThriftHttpServer.java">org/apache/hadoop/hbase/thrift/TestThriftHttpServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -67812,13 +67754,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.thrift.ThriftHttpServlet.java">org/apache/hadoop/hbase/thrift/ThriftHttpServlet.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -67827,13 +67769,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.thrift.ThriftServerRunner.java">org/apache/hadoop/hbase/thrift/ThriftServerRunner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -67842,13 +67784,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.thrift2.ThriftHBaseServiceHandler.java">org/apache/hadoop/hbase/thrift2/ThriftHBaseServiceHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -67857,13 +67799,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.thrift2.client.ThriftAdmin.java">org/apache/hadoop/hbase/thrift2/client/ThriftAdmin.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -67872,13 +67814,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.tool.BulkLoadHFilesTool.java">org/apache/hadoop/hbase/tool/BulkLoadHFilesTool.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -67887,13 +67829,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.tool.HFileContentValidator.java">org/apache/hadoop/hbase/tool/HFileContentValidator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -67902,13 +67844,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.tool.MapreduceTestingShim.java">org/apache/hadoop/hbase/tool/MapreduceTestingShim.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -67917,43 +67859,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.tool.TestBulkLoadHFilesSplitRecovery.java">org/apache/hadoop/hbase/tool/TestBulkLoadHFilesSplitRecovery.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>160</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>161</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>162</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>242</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>250</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -67962,49 +67904,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.trace.IntegrationTestSendTraceRequests.java">org/apache/hadoop/hbase/trace/IntegrationTestSendTraceRequests.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>44</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 6, expected level should be 4.</td>
 <td>118</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>119</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>148</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>153</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -68013,61 +67955,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.trace.TraceTree.java">org/apache/hadoop/hbase/trace/TraceTree.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Collection' import.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -68076,25 +68018,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.AbstractFileStatusFilter.java">org/apache/hadoop/hbase/util/AbstractFileStatusFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.fs.FileStatus' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'edu.umd.cs.findbugs.annotations.CheckForNull' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -68103,13 +68045,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.AbstractHBaseTool.java">org/apache/hadoop/hbase/util/AbstractHBaseTool.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -68118,37 +68060,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.Addressing.java">org/apache/hadoop/hbase/util/Addressing.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -68157,184 +68099,184 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.AvlUtil.java">org/apache/hadoop/hbase/util/AvlUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>158</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>206</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>234</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>238</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>242</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>262</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>431</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>520</td></tr>
+<td>431</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>520</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>521</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.BaseTestHBaseFsck.java">org/apache/hadoop/hbase/util/BaseTestHBaseFsck.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>223</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>224</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>225</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>236</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>262</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>290</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>355</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>356</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>358</td></tr>
+<td>356</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>358</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>384</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.BloomContext.java">org/apache/hadoop/hbase/util/BloomContext.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.HFile' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>48</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>49</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>70</td></tr>
+<td>49</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>70</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>71</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.BloomFilter.java">org/apache/hadoop/hbase/util/BloomFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -68343,19 +68285,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.BloomFilterChunk.java">org/apache/hadoop/hbase/util/BloomFilterChunk.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.regionserver.BloomType' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -68364,149 +68306,149 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.BloomFilterFactory.java">org/apache/hadoop/hbase/util/BloomFilterFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>158</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>159</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>160</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>205</td></tr>
+<td>160</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>205</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>206</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.BloomFilterUtil.java">org/apache/hadoop/hbase/util/BloomFilterUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>117</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>118</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>119</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>139</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>152</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>153</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>187</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>188</td></tr>
+<td>187</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>188</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
@@ -68514,13 +68456,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.BloomFilterWriter.java">org/apache/hadoop/hbase/util/BloomFilterWriter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -68529,856 +68471,856 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.BoundedPriorityBlockingQueue.java">org/apache/hadoop/hbase/util/BoundedPriorityBlockingQueue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.concurrent.BlockingQueue' import.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Collection' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.AbstractQueue' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>96</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>201</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>326</td></tr>
+<td>201</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>326</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>328</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ByteBufferUtils.java">org/apache/hadoop/hbase/util/ByteBufferUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>391</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>413</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 5, expected level should be 4.</td>
 <td>418</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>419</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>420</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>421</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>422</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
 <td>423</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>569</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>604</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>685</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>686</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>687</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>688</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>689</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>840</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>841</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>842</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>861</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>893</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>955</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>956</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>972</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>973</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1005</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1006</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1029</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1039</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1040</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1093</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1094</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1095</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1096</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1117</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1118</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1136</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1137</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1139</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1140</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1164</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1174</td></tr>
+<td>1164</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>1174</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>1176</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.Bytes.java">org/apache/hadoop/hbase/util/Bytes.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>201</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>248</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>367</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>398</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>416</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>580</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>597</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>622</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>623</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>650</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>771</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>789</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>802</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>932</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>948</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>970</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1019</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1048</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1068</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1084</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1099</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1109</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1560</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1561</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1562</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1563</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1568</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1592</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1605</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1606</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1607</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1634</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1635</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1645</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1646</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1655</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1665</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1772</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1785</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1786</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1788</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1796</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>1809</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>1818</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1878</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1879</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1883</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>1885</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>1912</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1986</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1989</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>1992</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2021</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2024</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>2027</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>2042</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2059</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2086</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2111</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>2128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>2140</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2153</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2164</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2165</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2168</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2350</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2351</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2352</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2373</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2374</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2375</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2401</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2402</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 5 should be on the previous line.</td>
 <td>2429</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2462</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>2469</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2475</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2476</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2497</td></tr>
+<td>2476</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>2497</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>2498</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ChecksumType.java">org/apache/hadoop/hbase/util/ChecksumType.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -69387,91 +69329,91 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ClassSize.java">org/apache/hadoop/hbase/util/ClassSize.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>350</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>351</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>364</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>374</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>376</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>378</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>380</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>382</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>384</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>386</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>388</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>440</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -69480,13 +69422,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.Classes.java">org/apache/hadoop/hbase/util/Classes.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -69495,13 +69437,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.CollectionBackedScanner.java">org/apache/hadoop/hbase/util/CollectionBackedScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -69510,25 +69452,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.CommonFSUtils.java">org/apache/hadoop/hbase/util/CommonFSUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>350</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>774</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -69537,37 +69479,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.CompressionTest.java">org/apache/hadoop/hbase/util/CompressionTest.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.CacheConfig' import.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -69576,24 +69518,18 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ConcurrentMapUtils.java">org/apache/hadoop/hbase/util/ConcurrentMapUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>61</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
@@ -69605,29 +69541,35 @@
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
+<td>61</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
 <td>62</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ConfigurationUtil.java">org/apache/hadoop/hbase/util/ConfigurationUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.util.StringUtils' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -69636,31 +69578,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ConnectionCache.java">org/apache/hadoop/hbase/util/ConnectionCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
 <td>34</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 46 should have line break after.</td>
 <td>74</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 44 should have line break after.</td>
 <td>75</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -69669,13 +69611,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ConstantDelayQueue.java">org/apache/hadoop/hbase/util/ConstantDelayQueue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -69684,88 +69626,88 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.CoprocessorClassLoader.java">org/apache/hadoop/hbase/util/CoprocessorClassLoader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class CoprocessorClassLoader should be declared as final.</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization rcurly' has incorrect indentation level 2, expected level should be one of the following: 6, 8.</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>169</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>238</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>264</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>266</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>267</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>268</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>372</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>395</td></tr>
+<td>372</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>395</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>396</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.DNS.java">org/apache/hadoop/hbase/util/DNS.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -69774,19 +69716,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.DirectMemoryUtils.java">org/apache/hadoop/hbase/util/DirectMemoryUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -69795,58 +69737,58 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.EncryptionTest.java">org/apache/hadoop/hbase/util/EncryptionTest.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class EncryptionTest should be declared as final.</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>53</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>54</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>78</td></tr>
+<td>54</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>78</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>79</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.EnvironmentEdgeManager.java">org/apache/hadoop/hbase/util/EnvironmentEdgeManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -69855,19 +69797,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.FSRegionScanner.java">org/apache/hadoop/hbase/util/FSRegionScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.fs.BlockLocation' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>RedundantImport</td>
@@ -69876,382 +69818,382 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.FSTableDescriptors.java">org/apache/hadoop/hbase/util/FSTableDescriptors.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>343</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>477</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>533</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>612</td></tr>
+<td>533</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>612</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>640</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.FSUtils.java">org/apache/hadoop/hbase/util/FSUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>118</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>135</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>169</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>235</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>261</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>263</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>269</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>273</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>284</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>285</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>288</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>310</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>351</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>368</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>386</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>404</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>443</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>458</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>498</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>560</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>602</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>603</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>607</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>611</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>692</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>694</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>763</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>798</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>927</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>952</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>953</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>954</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>955</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>956</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1003</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>1005</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1069</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>1071</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>1082</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1183</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'final' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1187</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>1270</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1292</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>1318</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1396</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1450</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1455</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1478</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1491</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1702</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1720</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1729</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1736</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -70260,19 +70202,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.FSVisitor.java">org/apache/hadoop/hbase/util/FSVisitor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>57</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -70281,13 +70223,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.FileStatusFilter.java">org/apache/hadoop/hbase/util/FileStatusFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -70296,13 +70238,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.GetJavaProperty.java">org/apache/hadoop/hbase/util/GetJavaProperty.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -70311,25 +70253,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.HBaseConfTool.java">org/apache/hadoop/hbase/util/HBaseConfTool.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -70338,457 +70280,457 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.HBaseFsck.java">org/apache/hadoop/hbase/util/HBaseFsck.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>143</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>711</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 11, expected level should be 10.</td>
 <td>769</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>847</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'regionName' must be private and have accessor methods.</td>
 <td>874</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'metaFirstKey' must be private and have accessor methods.</td>
 <td>875</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'metaLastKey' must be private and have accessor methods.</td>
 <td>876</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'storesFirstKey' must be private and have accessor methods.</td>
 <td>877</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'storesLastKey' must be private and have accessor methods.</td>
 <td>878</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>880</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>934</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>936</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1011</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>1046</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1143</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1148</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1198</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 118).</td>
 <td>1208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>1209</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>1217</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>1218</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1220</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1234</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1368</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1369</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1371</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>1389</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1390</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1394</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1405</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>1424</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1425</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>1454</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 123).</td>
 <td>1457</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>1468</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1610</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1611</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1614</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 7, expected level should be 6.</td>
 <td>1649</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 9, expected level should be 8.</td>
 <td>1652</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 7, expected level should be 6.</td>
 <td>1653</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1781</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>1971</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2099</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2141</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 235 lines (max allowed is 150).</td>
 <td>2162</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2165</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2237</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2403</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>2614</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2655</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2656</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'.' has incorrect indentation level 10, expected level should be 12.</td>
 <td>2682</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'errorCount' must be private and have accessor methods.</td>
 <td>2880</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2944</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>3110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>3181</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>3494</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>3537</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>3542</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>3543</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>3550</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>3555</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>3562</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>3564</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>3567</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 145).</td>
 <td>3569</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>3570</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 179).</td>
 <td>3571</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>3573</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3598</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>3599</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 39 should have line break after.</td>
 <td>3615</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
@@ -70797,50 +70739,50 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.HBaseFsckRepair.java">org/apache/hadoop/hbase/util/HBaseFsckRepair.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>87</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>88</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>89</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>90</td></tr>
+<td>89</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>90</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
@@ -70848,13 +70790,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.HBaseHomePath.java">org/apache/hadoop/hbase/util/HBaseHomePath.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -70863,55 +70805,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.HFileArchiveTestingUtil.java">org/apache/hadoop/hbase/util/HFileArchiveTestingUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class HFileArchiveTestingUtil should be declared as final.</td>
 <td>41</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>135</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>192</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>193</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -70920,73 +70862,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.HFileArchiveUtil.java">org/apache/hadoop/hbase/util/HFileArchiveUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>196</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>197</td></tr>
+<td>196</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>197</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>200</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.HFileTestUtil.java">org/apache/hadoop/hbase/util/HFileTestUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>53</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>76</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>90</td></tr>
+<td>76</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>90</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>104</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.Hash.java">org/apache/hadoop/hbase/util/Hash.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -70995,13 +70937,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.HashKey.java">org/apache/hadoop/hbase/util/HashKey.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -71010,19 +70952,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.HashedBytes.java">org/apache/hadoop/hbase/util/HashedBytes.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -71031,19 +70973,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.JSONBean.java">org/apache/hadoop/hbase/util/JSONBean.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -71052,38 +70994,38 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.JVM.java">org/apache/hadoop/hbase/util/JVM.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 14, expected level should be one of the following: 12, 23, 24.</td>
 <td>162</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>167</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>207</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>208</td></tr>
+<td>207</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>208</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
@@ -71091,68 +71033,68 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.JVMClusterUtil.java">org/apache/hadoop/hbase/util/JVMClusterUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>41</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>125</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>163</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>164</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>245</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>246</td></tr>
+<td>245</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>246</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
@@ -71160,72 +71102,66 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.JenkinsHash.java">org/apache/hadoop/hbase/util/JenkinsHash.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>86</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>87</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>96</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>99</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>102</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 158 lines (max allowed is 150).</td>
 <td>104</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>109</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
@@ -71234,161 +71170,167 @@
 <td>109</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>109</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>189</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>190</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>191</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>192</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>193</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>195</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>196</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>197</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>198</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>199</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>200</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>201</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>205</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>206</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>207</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>208</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>209</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>210</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>211</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>213</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>214</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>215</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -71397,25 +71339,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.JvmPauseMonitor.java">org/apache/hadoop/hbase/util/JvmPauseMonitor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.metrics.JvmPauseMonitorSource' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -71424,43 +71366,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.KeyLocker.java">org/apache/hadoop/hbase/util/KeyLocker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 12, expected level should be one of the following: 6, 8.</td>
 <td>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 14, expected level should be one of the following: 8, 10.</td>
 <td>56</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 12, expected level should be one of the following: 6, 8.</td>
 <td>57</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 10, expected level should be one of the following: 4, 6.</td>
 <td>58</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>64</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -71469,19 +71411,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.LeaseNotRecoveredException.java">org/apache/hadoop/hbase/util/LeaseNotRecoveredException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -71490,13 +71432,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.LoadTestDataGeneratorWithMOB.java">org/apache/hadoop/hbase/util/LoadTestDataGeneratorWithMOB.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -71505,19 +71447,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.LoadTestDataGeneratorWithTags.java">org/apache/hadoop/hbase/util/LoadTestDataGeneratorWithTags.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -71526,31 +71468,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.LoadTestTool.java">org/apache/hadoop/hbase/util/LoadTestTool.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>333</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 191 lines (max allowed is 150).</td>
 <td>592</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>665</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -71559,13 +71501,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.LogMonitoring.java">org/apache/hadoop/hbase/util/LogMonitoring.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -71574,46 +71516,46 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.MD5Hash.java">org/apache/hadoop/hbase/util/MD5Hash.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>34</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>40</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>53</td></tr>
+<td>40</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>53</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>54</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ManualEnvironmentEdge.java">org/apache/hadoop/hbase/util/ManualEnvironmentEdge.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -71622,19 +71564,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.MapreduceDependencyClasspathTool.java">org/apache/hadoop/hbase/util/MapreduceDependencyClasspathTool.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -71643,55 +71585,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ModifyRegionUtils.java">org/apache/hadoop/hbase/util/ModifyRegionUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>111</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>132</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 117).</td>
 <td>136</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>171</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -71700,13 +71642,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.MoveWithAck.java">org/apache/hadoop/hbase/util/MoveWithAck.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -71715,13 +71657,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.MoveWithoutAck.java">org/apache/hadoop/hbase/util/MoveWithoutAck.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -71730,31 +71672,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.MultiThreadedAction.java">org/apache/hadoop/hbase/util/MultiThreadedAction.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 117).</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 119).</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 166 lines (max allowed is 150).</td>
 <td>326</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -71763,13 +71705,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.MultiThreadedReader.java">org/apache/hadoop/hbase/util/MultiThreadedReader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -71778,13 +71720,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.MultiThreadedReaderWithACL.java">org/apache/hadoop/hbase/util/MultiThreadedReaderWithACL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -71793,121 +71735,121 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.MultiThreadedUpdater.java">org/apache/hadoop/hbase/util/MultiThreadedUpdater.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.test.LoadTestDataGenerator' import.</td>
 <td>48</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>169</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 18, expected level should be 20.</td>
 <td>206</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
 <td>207</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
 <td>208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
 <td>209</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
 <td>210</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
 <td>211</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 18, expected level should be 20.</td>
 <td>212</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
 <td>213</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
 <td>216</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
 <td>217</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
 <td>218</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
 <td>219</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 18, expected level should be 20.</td>
 <td>220</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
 <td>221</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
 <td>222</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>269</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -71916,19 +71858,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.MultiThreadedWriter.java">org/apache/hadoop/hbase/util/MultiThreadedWriter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -71937,13 +71879,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.MunkresAssignment.java">org/apache/hadoop/hbase/util/MunkresAssignment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -71952,88 +71894,88 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.MurmurHash3.java">org/apache/hadoop/hbase/util/MurmurHash3.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>69</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>78</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>79</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>80</td></tr>
+<td>79</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>80</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>81</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig.java">org/apache/hadoop/hbase/util/NettyEventLoopGroupConfig.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -72042,271 +71984,271 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.OrderedBytes.java">org/apache/hadoop/hbase/util/OrderedBytes.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>344</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>344</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>346</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>459</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>460</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>461</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>462</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>463</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>464</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>465</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>466</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>467</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>574</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>575</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>597</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>598</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 37 should have line break after.</td>
 <td>644</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 36 should have line break after.</td>
 <td>645</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 49 should have line break after.</td>
 <td>719</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 48 should have line break after.</td>
 <td>720</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 60 should have line break after.</td>
 <td>721</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>829</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>913</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>914</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>915</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>916</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>935</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>936</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>937</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>954</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>970</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>978</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>979</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>996</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>998</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>1094</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>1095</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1156</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1191</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>1748</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
@@ -72315,103 +72257,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.Pair.java">org/apache/hadoop/hbase/util/Pair.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 1 should be on the previous line.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>51</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>105</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>112</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>119</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>122</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>124</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -72420,220 +72362,220 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.PairOfSameType.java">org/apache/hadoop/hbase/util/PairOfSameType.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>65</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>80</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>82</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>103</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>104</td></tr>
+<td>103</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>104</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>105</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.PoolMap.java">org/apache/hadoop/hbase/util/PoolMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>62</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>64</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'synchronized' has incorrect indentation level 5, expected level should be 4.</td>
 <td>68</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'synchronized' child has incorrect indentation level 7, expected level should be 6.</td>
 <td>69</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 7, expected level should be 6.</td>
 <td>71</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 9, expected level should be 8.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 9, expected level should be 8.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 7, expected level should be 6.</td>
 <td>74</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' has incorrect indentation level 7, expected level should be 6.</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 9, expected level should be 8.</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 7, expected level should be 6.</td>
 <td>78</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 9, expected level should be 8.</td>
 <td>79</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 11, expected level should be 10.</td>
 <td>80</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 9, expected level should be 8.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 9, expected level should be 8.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch rcurly' has incorrect indentation level 7, expected level should be 6.</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'synchronized rcurly' has incorrect indentation level 5, expected level should be 4.</td>
 <td>85</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 5, expected level should be 4.</td>
 <td>131</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>175</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>176</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>177</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>178</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -72642,49 +72584,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.PoolMapTestBase.java">org/apache/hadoop/hbase/util/PoolMapTestBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.junit.Assert.assertEquals.</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.junit.Assert.assertTrue.</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.io.IOException.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Objects.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.concurrent.atomic.AtomicBoolean.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.concurrent.atomic.AtomicReference.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -72693,13 +72635,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.PositionedByteRange.java">org/apache/hadoop/hbase/util/PositionedByteRange.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -72708,52 +72650,52 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.PrettyPrinter.java">org/apache/hadoop/hbase/util/PrettyPrinter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>34</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>84</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>85</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>163</td></tr>
+<td>85</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>163</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>272</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ProcessBasedLocalHBaseCluster.java">org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -72762,19 +72704,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ReflectionUtils.java">org/apache/hadoop/hbase/util/ReflectionUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'edu.umd.cs.findbugs.annotations.NonNull' import.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -72783,25 +72725,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.RegionMover.java">org/apache/hadoop/hbase/util/RegionMover.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class RegionMover should be declared as final.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>191</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -72810,136 +72752,136 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.RegionSplitCalculator.java">org/apache/hadoop/hbase/util/RegionSplitCalculator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes.ByteArrayComparator' import.</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>86</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>88</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>90</td></tr>
+<td>88</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>90</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>222</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.RegionSplitter.java">org/apache/hadoop/hbase/util/RegionSplitter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>140</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>389</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>431</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 198 lines (max allowed is 150).</td>
 <td>453</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>454</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>570</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>655</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>739</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>748</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>779</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>780</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>794</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>820</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -72948,13 +72890,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.RetryCounter.java">org/apache/hadoop/hbase/util/RetryCounter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -72963,37 +72905,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.RollingStatCalculator.java">org/apache/hadoop/hbase/util/RollingStatCalculator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>48</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 5 should be on the previous line.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -73002,25 +72944,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ServerCommandLine.java">org/apache/hadoop/hbase/util/ServerCommandLine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>132</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -73029,13 +72971,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ServerRegionReplicaUtil.java">org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -73044,13 +72986,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ShutdownHookManager.java">org/apache/hadoop/hbase/util/ShutdownHookManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -73059,13 +73001,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.SimpleByteRange.java">org/apache/hadoop/hbase/util/SimpleByteRange.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EqualsHashCode</td>
@@ -73074,26 +73016,26 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.SimpleMutableByteRange.java">org/apache/hadoop/hbase/util/SimpleMutableByteRange.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>124</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>131</td></tr>
+<td>124</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>131</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EqualsHashCode</td>
 <td>Definition of 'equals()' without corresponding definition of 'hashCode()'.</td>
@@ -73101,13 +73043,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.SimplePositionedByteRange.java">org/apache/hadoop/hbase/util/SimplePositionedByteRange.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -73116,52 +73058,52 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.SimplePositionedMutableByteRange.java">org/apache/hadoop/hbase/util/SimplePositionedMutableByteRange.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>183</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>190</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>217</td></tr>
+<td>190</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>217</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>224</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.StealJobQueue.java">org/apache/hadoop/hbase/util/StealJobQueue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Comparator' import.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -73170,13 +73112,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.StoppableImplementation.java">org/apache/hadoop/hbase/util/StoppableImplementation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -73185,19 +73127,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestBloomFilterChunk.java">org/apache/hadoop/hbase/util/TestBloomFilterChunk.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -73206,94 +73148,94 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestCompressionTest.java">org/apache/hadoop/hbase/util/TestCompressionTest.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>119</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>120</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>122</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>123</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>124</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>125</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>126</td></tr>
+<td>125</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>126</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>129</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestCoprocessorScanPolicy.java">org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -73302,61 +73244,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestFSTableDescriptors.java">org/apache/hadoop/hbase/util/TestFSTableDescriptors.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>212</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>227</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>238</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>274</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>298</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>301</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>353</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -73365,43 +73307,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestFSUtils.java">org/apache/hadoop/hbase/util/TestFSUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>143</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>150</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 122).</td>
 <td>343</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -73410,13 +73352,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestGsonUtil.java">org/apache/hadoop/hbase/util/TestGsonUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -73425,13 +73367,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestHBaseFsckMOB.java">org/apache/hadoop/hbase/util/TestHBaseFsckMOB.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -73440,13 +73382,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestIdLock.java">org/apache/hadoop/hbase/util/TestIdLock.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -73455,61 +73397,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestIdReadWriteLockWithObjectPool.java">org/apache/hadoop/hbase/util/TestIdReadWriteLockWithObjectPool.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>135</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>137</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>138</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>139</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>142</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>143</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>144</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -73518,13 +73460,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestMiniClusterLoadEncoded.java">org/apache/hadoop/hbase/util/TestMiniClusterLoadEncoded.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -73533,13 +73475,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestMiniClusterLoadSequential.java">org/apache/hadoop/hbase/util/TestMiniClusterLoadSequential.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -73548,13 +73490,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestRegionMover2.java">org/apache/hadoop/hbase/util/TestRegionMover2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -73563,13 +73505,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestRegionMover3.java">org/apache/hadoop/hbase/util/TestRegionMover3.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -73578,19 +73520,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestRegionMoverWithRSGroupEnable.java">org/apache/hadoop/hbase/util/TestRegionMoverWithRSGroupEnable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.junit.Assert.assertEquals' import.</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -73599,73 +73541,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestRegionSplitter.java">org/apache/hadoop/hbase/util/TestRegionSplitter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>64</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>66</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>67</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>69</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>79</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -73674,19 +73616,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestRoundRobinPoolMap.java">org/apache/hadoop/hbase/util/TestRoundRobinPoolMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Random.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -73695,52 +73637,52 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestSortedList.java">org/apache/hadoop/hbase/util/TestSortedList.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>78</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
-<td>113</td></tr>
+<td>78</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>113</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>165</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.TestThreadLocalPoolMap.java">org/apache/hadoop/hbase/util/TestThreadLocalPoolMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Random.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -73749,43 +73691,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.Threads.java">org/apache/hadoop/hbase/util/Threads.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>102</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>115</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>119</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -73794,259 +73736,259 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.Triple.java">org/apache/hadoop/hbase/util/Triple.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>64</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>66</td></tr>
+<td>64</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>66</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>68</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.UnsafeAccess.java">org/apache/hadoop/hbase/util/UnsafeAccess.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>170</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>171</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>197</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>198</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>212</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>213</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>226</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>227</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>239</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>240</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>254</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>255</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>268</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>269</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>281</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>282</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>314</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>315</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>316</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>317</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>318</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>347</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>348</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>349</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>350</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>351</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>371</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>372</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>373</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>374</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>375</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>467</td></tr>
+<td>375</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>467</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>468</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.UnsafeAvailChecker.java">org/apache/hadoop/hbase/util/UnsafeAvailChecker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -74055,13 +73997,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.VersionInfo.java">org/apache/hadoop/hbase/util/VersionInfo.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -74070,208 +74012,208 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.Writables.java">org/apache/hadoop/hbase/util/Writables.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.io.DataInputBuffer' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>97</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>113</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>114</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>116</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>120</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>146</td></tr>
+<td>120</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>146</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>158</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.ZKDataMigrator.java">org/apache/hadoop/hbase/util/ZKDataMigrator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.zookeeper.ZKUtil' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class ZKDataMigrator should be declared as final.</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>64</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>72</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>76</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>78</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>79</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>80</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>84</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>99</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -74280,19 +74222,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.compaction.TestMajorCompactor.java">org/apache/hadoop/hbase/util/compaction/TestMajorCompactor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.junit.After' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -74301,94 +74243,94 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.hbck.HFileCorruptionChecker.java">org/apache/hadoop/hbase/util/hbck/HFileCorruptionChecker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>162</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>198</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>270</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>308</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>344</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>347</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>357</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>494</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>530</td></tr>
+<td>494</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>530</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>538</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.java">org/apache/hadoop/hbase/util/hbck/HbckTestingUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -74397,13 +74339,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.hbck.ReplicationChecker.java">org/apache/hadoop/hbase/util/hbck/ReplicationChecker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -74412,64 +74354,64 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.test.LoadTestDataGenerator.java">org/apache/hadoop/hbase/util/test/LoadTestDataGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Get' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>147</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>148</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>150</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>158</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>159</td></tr>
+<td>158</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>159</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>161</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.test.LoadTestDataGeneratorWithACL.java">org/apache/hadoop/hbase/util/test/LoadTestDataGeneratorWithACL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -74478,19 +74420,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.BoundedGroupingStrategy.java">org/apache/hadoop/hbase/wal/BoundedGroupingStrategy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -74499,19 +74441,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.DisabledWALProvider.java">org/apache/hadoop/hbase/wal/DisabledWALProvider.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 49 should have line break after.</td>
 <td>201</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -74520,19 +74462,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.FileSystemProxy.java">org/apache/hadoop/hbase/wal/FileSystemProxy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -74541,37 +74483,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.IOTestProvider.java">org/apache/hadoop/hbase/wal/IOTestProvider.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>178</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>187</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>246</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -74580,13 +74522,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.NamespaceGroupingStrategy.java">org/apache/hadoop/hbase/wal/NamespaceGroupingStrategy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -74595,13 +74537,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper.java">org/apache/hadoop/hbase/wal/NettyAsyncFSWALConfigHelper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -74610,13 +74552,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.OutputSink.java">org/apache/hadoop/hbase/wal/OutputSink.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -74625,13 +74567,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.RecoveredEditsOutputSink.java">org/apache/hadoop/hbase/wal/RecoveredEditsOutputSink.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -74640,25 +74582,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.TestBoundedRegionGroupingStrategy.java">org/apache/hadoop/hbase/wal/TestBoundedRegionGroupingStrategy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 21.</td>
 <td>142</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>154</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -74667,136 +74609,136 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.TestFSHLogProvider.java">org/apache/hadoop/hbase/wal/TestFSHLogProvider.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>168</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>177</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>178</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>264</td></tr>
+<td>178</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>264</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>340</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.TestWALFactory.java">org/apache/hadoop/hbase/wal/TestWALFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>183</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>230</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>242</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>295</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>309</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>316</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>332</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>339</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>343</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>348</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>407</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>485</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>548</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>622</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -74805,31 +74747,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.TestWALFiltering.java">org/apache/hadoop/hbase/wal/TestWALFiltering.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'org' has incorrect indentation level 2, expected level should be 4.</td>
 <td>114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>149</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -74838,19 +74780,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.TestWALMethods.java">org/apache/hadoop/hbase/wal/TestWALMethods.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -74859,13 +74801,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.TestWALOpenAfterDNRollingStart.java">org/apache/hadoop/hbase/wal/TestWALOpenAfterDNRollingStart.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -74874,13 +74816,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.TestWALRootDir.java">org/apache/hadoop/hbase/wal/TestWALRootDir.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -74889,85 +74831,85 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.TestWALSplit.java">org/apache/hadoop/hbase/wal/TestWALSplit.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>227</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>682</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>818</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>889</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>890</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 10, 12.</td>
 <td>914</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 12, 14.</td>
 <td>916</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 12, 14.</td>
 <td>917</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 10, 12.</td>
 <td>918</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 8, 10.</td>
 <td>919</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1034</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>1038</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -74976,52 +74918,52 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.WAL.java">org/apache/hadoop/hbase/wal/WAL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>181</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>182</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>183</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>184</td></tr>
+<td>183</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>184</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>220</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.WALFactory.java">org/apache/hadoop/hbase/wal/WALFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -75030,13 +74972,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.WALKey.java">org/apache/hadoop/hbase/wal/WALKey.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -75045,131 +74987,131 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.WALKeyImpl.java">org/apache/hadoop/hbase/wal/WALKeyImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>289</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>290</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>307</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>330</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>331</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>332</td></tr>
+<td>331</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>332</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>333</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.WALPerformanceEvaluation.java">org/apache/hadoop/hbase/wal/WALPerformanceEvaluation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>173</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 193 lines (max allowed is 150).</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>355</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>358</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>379</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>411</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>413</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>439</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>569</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>577</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>579</td></tr>
+<td>577</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>579</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
@@ -75177,13 +75119,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.WALSplitter.java">org/apache/hadoop/hbase/wal/WALSplitter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -75192,13 +75134,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.HQuorumPeer.java">org/apache/hadoop/hbase/zookeeper/HQuorumPeer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -75207,13 +75149,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient.java">org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -75222,40 +75164,40 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ZKConfig.java">org/apache/hadoop/hbase/zookeeper/ZKConfig.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>117</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>210</td></tr>
+<td>117</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>210</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>212</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ZKMetadata.java">org/apache/hadoop/hbase/zookeeper/ZKMetadata.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -75264,13 +75206,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ZKWatcher.java">org/apache/hadoop/hbase/zookeeper/ZKWatcher.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -75279,109 +75221,109 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ZNodePaths.java">org/apache/hadoop/hbase/zookeeper/ZNodePaths.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'baseZNode' must be private and have accessor methods.</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'rsZNode' must be private and have accessor methods.</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'drainingZNode' must be private and have accessor methods.</td>
 <td>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'masterAddressZNode' must be private and have accessor methods.</td>
 <td>56</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'backupMasterAddressesZNode' must be private and have accessor methods.</td>
 <td>58</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'clusterStateZNode' must be private and have accessor methods.</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'tableZNode' must be private and have accessor methods.</td>
 <td>66</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'clusterIdZNode' must be private and have accessor methods.</td>
 <td>68</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'splitLogZNode' must be private and have accessor methods.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'balancerZNode' must be private and have accessor methods.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'regionNormalizerZNode' must be private and have accessor methods.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'switchZNode' must be private and have accessor methods.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'masterMaintZNode' must be private and have accessor methods.</td>
 <td>78</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'replicationZNode' must be private and have accessor methods.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'peersZNode' must be private and have accessor methods.</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'queuesZNode' must be private and have accessor methods.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
@@ -75390,13 +75332,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ZooKeeperHelper.java">org/apache/hadoop/hbase/zookeeper/ZooKeeperHelper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -75405,13 +75347,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.metrics2.lib.TestMutableRangeHistogram.java">org/apache/hadoop/metrics2/lib/TestMutableRangeHistogram.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -75425,7 +75367,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle.rss b/checkstyle.rss
index 2818597..3c13291 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@
     <copyright>&#169;2007 - 2021 The Apache Software Foundation</copyright>
     <item>
       <title>File: 4364,
-             Errors: 9156,
+             Errors: 9151,
              Warnings: 0,
              Infos: 0
       </title>
@@ -11199,7 +11199,7 @@
                   0
                 </td>
                 <td>
-                  1
+                  0
                 </td>
               </tr>
                           <tr>
@@ -23631,7 +23631,7 @@
                   0
                 </td>
                 <td>
-                  26
+                  24
                 </td>
               </tr>
                           <tr>
@@ -59989,7 +59989,7 @@
                   0
                 </td>
                 <td>
-                  2
+                  0
                 </td>
               </tr>
                           <tr>
diff --git a/coc.html b/coc.html
index 2021d11..bfe417c 100644
--- a/coc.html
+++ b/coc.html
@@ -241,7 +241,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependencies.html b/dependencies.html
index 1b54703..bc0bebf 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -313,7 +313,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 45a53fc..75fca19 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -824,7 +824,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-info.html b/dependency-info.html
index 10e5b25..33b0f98 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -194,7 +194,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-management.html b/dependency-management.html
index e5b0b90..f3c8969 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -1040,7 +1040,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index a1168a8..cd90236 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -48857,10 +48857,6 @@
 <div class="block">Blocks until elements available in <code>q</code> then tries to grab as many as possible before
  returning.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getRandomIterationOrder-int-">getRandomIterationOrder(int)</a></span> - Method in class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a></dt>
-<dd>
-<div class="block">Returns a random iteration order of indexes of an array with size length</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/crypto/aes/AES.html#getRandomKey--">getRandomKey()</a></span> - Method in class org.apache.hadoop.hbase.io.crypto.aes.<a href="org/apache/hadoop/hbase/io/crypto/aes/AES.html" title="class in org.apache.hadoop.hbase.io.crypto.aes">AES</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/crypto/aes/CommonsCryptoAES.html#getRandomKey--">getRandomKey()</a></span> - Method in class org.apache.hadoop.hbase.io.crypto.aes.<a href="org/apache/hadoop/hbase/io/crypto/aes/CommonsCryptoAES.html" title="class in org.apache.hadoop.hbase.io.crypto.aes">CommonsCryptoAES</a></dt>
@@ -71768,7 +71764,7 @@
 </dd>
 <dt><a href="org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">LocalityBasedCandidateGenerator</span></a> - Class in <a href="org/apache/hadoop/hbase/master/balancer/package-summary.html">org.apache.hadoop.hbase.master.balancer</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#LocalityBasedCandidateGenerator-org.apache.hadoop.hbase.master.MasterServices-">LocalityBasedCandidateGenerator(MasterServices)</a></span> - Constructor for class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">LocalityBasedCandidateGenerator</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#LocalityBasedCandidateGenerator--">LocalityBasedCandidateGenerator()</a></span> - Constructor for class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">LocalityBasedCandidateGenerator</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#LocalityBasedCostFunction-org.apache.hadoop.conf.Configuration-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType-java.lang.String-float-">LocalityBasedCostFunction(Configuration, BaseLoadBalancer.Cluster.LocalityType, String, float)</a></span> - Constructor for class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.LocalityBasedCostFunction</a></dt>
 <dd>&nbsp;</dd>
@@ -75842,8 +75838,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/favored/FavoredNodesManager.html#masterServices">masterServices</a></span> - Variable in class org.apache.hadoop.hbase.favored.<a href="org/apache/hadoop/hbase/favored/FavoredNodesManager.html" title="class in org.apache.hadoop.hbase.favored">FavoredNodesManager</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#masterServices">masterServices</a></span> - Variable in class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">LocalityBasedCandidateGenerator</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/ClusterSchemaServiceImpl.html#masterServices">masterServices</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/ClusterSchemaServiceImpl.html" title="class in org.apache.hadoop.hbase.master">ClusterSchemaServiceImpl</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/janitor/MetaFixer.html#masterServices">masterServices</a></span> - Variable in class org.apache.hadoop.hbase.master.janitor.<a href="org/apache/hadoop/hbase/master/janitor/MetaFixer.html" title="class in org.apache.hadoop.hbase.master.janitor">MetaFixer</a></dt>
@@ -108662,8 +108656,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices(MasterServices)</a></span> - Method in class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">FavoredStochasticBalancer</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices(MasterServices)</a></span> - Method in class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/LoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices(MasterServices)</a></span> - Method in interface org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a></dt>
 <dd>
 <div class="block">Set the master service.</div>
@@ -110083,8 +110075,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/model/VersionModel.html#setServerVersion-java.lang.String-">setServerVersion(String)</a></span> - Method in class org.apache.hadoop.hbase.rest.model.<a href="org/apache/hadoop/hbase/rest/model/VersionModel.html" title="class in org.apache.hadoop.hbase.rest.model">VersionModel</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#setServices-org.apache.hadoop.hbase.master.MasterServices-">setServices(MasterServices)</a></span> - Method in class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">LocalityBasedCandidateGenerator</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/HBaseFsck.html#setShouldRerun--">setShouldRerun()</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/HBaseFsck.html" title="class in org.apache.hadoop.hbase.util">HBaseFsck</a></dt>
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
diff --git a/devapidocs/org/apache/hadoop/hbase/ChoreService.html b/devapidocs/org/apache/hadoop/hbase/ChoreService.html
index b13d490..45bf955 100644
--- a/devapidocs/org/apache/hadoop/hbase/ChoreService.html
+++ b/devapidocs/org/apache/hadoop/hbase/ChoreService.html
@@ -739,7 +739,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>printChoreServiceDetails</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ChoreService.html#line.420">printChoreServiceDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;header)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ChoreService.html#line.423">printChoreServiceDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;header)</pre>
 <div class="block">Prints a summary of important details about the service. Used for debugging purposes</div>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 530a817..761b65d 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -166,10 +166,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 389f801..02cd0cc 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -453,25 +453,25 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CatalogReplicaMode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CatalogReplicaMode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ServerType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ServerType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/LogQueryFilter.FilterByOperator.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">LogQueryFilter.FilterByOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/LogQueryFilter.Type.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">LogQueryFilter.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ServerType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ServerType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/LogQueryFilter.FilterByOperator.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">LogQueryFilter.FilterByOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CatalogReplicaMode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CatalogReplicaMode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index 69947c3..0754bc1 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -190,13 +190,13 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/hbtop/field/package-tree.html b/devapidocs/org/apache/hadoop/hbase/hbtop/field/package-tree.html
index a951142..33940b4 100644
--- a/devapidocs/org/apache/hadoop/hbase/hbtop/field/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/hbtop/field/package-tree.html
@@ -92,8 +92,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.hbtop.field.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/field/FieldValueType.html" title="enum in org.apache.hadoop.hbase.hbtop.field"><span class="typeNameLink">FieldValueType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.hbtop.field.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/field/Field.html" title="enum in org.apache.hadoop.hbase.hbtop.field"><span class="typeNameLink">Field</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.hbtop.field.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/field/FieldValueType.html" title="enum in org.apache.hadoop.hbase.hbtop.field"><span class="typeNameLink">FieldValueType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/hbtop/terminal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/hbtop/terminal/package-tree.html
index 348c0be..bf67872 100644
--- a/devapidocs/org/apache/hadoop/hbase/hbtop/terminal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/hbtop/terminal/package-tree.html
@@ -107,8 +107,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.hbtop.terminal.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/terminal/KeyPress.Type.html" title="enum in org.apache.hadoop.hbase.hbtop.terminal"><span class="typeNameLink">KeyPress.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.hbtop.terminal.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/terminal/Color.html" title="enum in org.apache.hadoop.hbase.hbtop.terminal"><span class="typeNameLink">Color</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.hbtop.terminal.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/terminal/KeyPress.Type.html" title="enum in org.apache.hadoop.hbase.hbtop.terminal"><span class="typeNameLink">KeyPress.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
index 7cce376..d0bf6ab 100644
--- a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
@@ -140,9 +140,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/HttpConfig.Policy.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">HttpConfig.Policy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Output.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Output</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Event.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Event</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/HttpConfig.Policy.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">HttpConfig.Policy</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index 5b656df..92d32b5 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -305,12 +305,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheFactory.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockCacheFactory.ExternalBlockCaches</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/ReaderContext.ReaderType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">ReaderContext.ReaderType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheFactory.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockCacheFactory.ExternalBlockCaches</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/ReaderContext.ReaderType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">ReaderContext.ReaderType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index 3139f55..24a3b11 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -356,9 +356,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index d9d5afd..c533474 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -301,10 +301,10 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/WALPlayer.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">WALPlayer.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/WALPlayer.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">WALPlayer.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
index 7ebf7f7..e2ae864 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
@@ -151,8 +151,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">TransitRegionStateProcedure.TransitionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerState.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">ServerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">TransitRegionStateProcedure.TransitionType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html
index aaa489e..2ee2d0c 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":6,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10};
+var methods = {"i0":6,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -114,7 +114,7 @@
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-abstract class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.34">CandidateGenerator</a>
+abstract class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.29">CandidateGenerator</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Generates a candidate action to be applied to the cluster for cost function search</div>
 </li>
@@ -164,26 +164,20 @@
          int&nbsp;toRegion)</code>&nbsp;</td>
 </tr>
 <tr id="i2" class="altColor">
-<td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getRandomIterationOrder-int-">getRandomIterationOrder</a></span>(int&nbsp;length)</code>
-<div class="block">Returns a random iteration order of indexes of an array with size length</div>
-</td>
-</tr>
-<tr id="i3" class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                    int&nbsp;rackIndex)</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                      int&nbsp;serverIndex)</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                 int&nbsp;server,
@@ -191,13 +185,13 @@
 <div class="block">From a list of regions pick a random one.</div>
 </td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                  int&nbsp;thisServer,
                  int&nbsp;otherServer)</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</code>&nbsp;</td>
 </tr>
@@ -229,7 +223,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CandidateGenerator</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.34">CandidateGenerator</a>()</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.29">CandidateGenerator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -246,7 +240,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>generate</h4>
-<pre>abstract&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.36">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>abstract&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.31">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 </li>
 </ul>
 <a name="pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">
@@ -255,7 +249,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>pickRandomRegion</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.50">pickRandomRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.45">pickRandomRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                      int&nbsp;server,
                      double&nbsp;chanceOfNoSwap)</pre>
 <div class="block">From a list of regions pick a random one. Null can be returned which
@@ -279,7 +273,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>pickRandomServer</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.62">pickRandomServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.57">pickRandomServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 </li>
 </ul>
 <a name="pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">
@@ -288,7 +282,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>pickRandomRack</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.70">pickRandomRack</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.65">pickRandomRack</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 </li>
 </ul>
 <a name="pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">
@@ -297,7 +291,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>pickOtherRandomServer</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.78">pickOtherRandomServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.73">pickOtherRandomServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                           int&nbsp;serverIndex)</pre>
 </li>
 </ul>
@@ -307,7 +301,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>pickOtherRandomRack</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.90">pickOtherRandomRack</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.85">pickOtherRandomRack</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                         int&nbsp;rackIndex)</pre>
 </li>
 </ul>
@@ -317,7 +311,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>pickRandomRegions</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.102">pickRandomRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.97">pickRandomRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                                   int&nbsp;thisServer,
                                                   int&nbsp;otherServer)</pre>
 </li>
@@ -325,25 +319,15 @@
 <a name="getAction-int-int-int-int-">
 <!--   -->
 </a>
-<ul class="blockList">
+<ul class="blockListLast">
 <li class="blockList">
 <h4>getAction</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.122">getAction</a>(int&nbsp;fromServer,
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.117">getAction</a>(int&nbsp;fromServer,
                                                     int&nbsp;fromRegion,
                                                     int&nbsp;toServer,
                                                     int&nbsp;toRegion)</pre>
 </li>
 </ul>
-<a name="getRandomIterationOrder-int-">
-<!--   -->
-</a>
-<ul class="blockListLast">
-<li class="blockList">
-<h4>getRandomIterationOrder</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.142">getRandomIterationOrder</a>(int&nbsp;length)</pre>
-<div class="block">Returns a random iteration order of indexes of an array with size length</div>
-</li>
-</ul>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.FavoredNodeLoadPicker.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.FavoredNodeLoadPicker.html
index 41a40da..43c73bb 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.FavoredNodeLoadPicker.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.FavoredNodeLoadPicker.html
@@ -180,7 +180,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getRandomIterationOrder-int-">getRandomIterationOrder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.FavoredNodeLocalityPicker.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.FavoredNodeLocalityPicker.html
index 4819097..63ae659 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.FavoredNodeLocalityPicker.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.FavoredNodeLocalityPicker.html
@@ -178,7 +178,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getRandomIterationOrder-int-">getRandomIterationOrder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html
index 2100795..3e524d8 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html
@@ -504,7 +504,7 @@
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a></code></dd>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer</a></code></dd>
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer</a></code></dd>
 </dl>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/LoadCandidateGenerator.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/LoadCandidateGenerator.html
index ecda0da..abeb1f6 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/LoadCandidateGenerator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/LoadCandidateGenerator.html
@@ -172,7 +172,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getRandomIterationOrder-int-">getRandomIterationOrder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html
index 1ca92ba..fe64fd4 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10};
+var methods = {"i0":10,"i1":10,"i2":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -75,13 +75,13 @@
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
 <li>Nested&nbsp;|&nbsp;</li>
-<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li>Field&nbsp;|&nbsp;</li>
 <li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.summary">Method</a></li>
 </ul>
 <ul class="subNavList">
 <li>Detail:&nbsp;</li>
-<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li>Field&nbsp;|&nbsp;</li>
 <li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.detail">Method</a></li>
 </ul>
@@ -115,7 +115,7 @@
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#line.28">LocalityBasedCandidateGenerator</a>
+class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#line.26">LocalityBasedCandidateGenerator</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a></pre>
 </li>
 </ul>
@@ -123,25 +123,6 @@
 <div class="summary">
 <ul class="blockList">
 <li class="blockList">
-<!-- =========== FIELD SUMMARY =========== -->
-<ul class="blockList">
-<li class="blockList"><a name="field.summary">
-<!--   -->
-</a>
-<h3>Field Summary</h3>
-<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
-<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Modifier and Type</th>
-<th class="colLast" scope="col">Field and Description</th>
-</tr>
-<tr class="altColor">
-<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#masterServices">masterServices</a></span></code>&nbsp;</td>
-</tr>
-</table>
-</li>
-</ul>
 <!-- ======== CONSTRUCTOR SUMMARY ======== -->
 <ul class="blockList">
 <li class="blockList"><a name="constructor.summary">
@@ -154,7 +135,7 @@
 <th class="colOne" scope="col">Constructor and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#LocalityBasedCandidateGenerator-org.apache.hadoop.hbase.master.MasterServices-">LocalityBasedCandidateGenerator</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</code>&nbsp;</td>
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#LocalityBasedCandidateGenerator--">LocalityBasedCandidateGenerator</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -182,11 +163,7 @@
                    int&nbsp;server)</code>&nbsp;</td>
 </tr>
 <tr id="i2" class="altColor">
-<td class="colFirst"><code>(package private) void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#setServices-org.apache.hadoop.hbase.master.MasterServices-">setServices</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;services)</code>&nbsp;</td>
-</tr>
-<tr id="i3" class="rowColor">
-<td class="colFirst"><code>private org.apache.hbase.thirdparty.com.google.common.base.Optional&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&gt;</code></td>
+<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#tryMoveOrSwap-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-int-">tryMoveOrSwap</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
              int&nbsp;fromServer,
              int&nbsp;fromRegion,
@@ -198,7 +175,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getRandomIterationOrder-int-">getRandomIterationOrder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -215,36 +192,19 @@
 <div class="details">
 <ul class="blockList">
 <li class="blockList">
-<!-- ============ FIELD DETAIL =========== -->
-<ul class="blockList">
-<li class="blockList"><a name="field.detail">
-<!--   -->
-</a>
-<h3>Field Detail</h3>
-<a name="masterServices">
-<!--   -->
-</a>
-<ul class="blockListLast">
-<li class="blockList">
-<h4>masterServices</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#line.30">masterServices</a></pre>
-</li>
-</ul>
-</li>
-</ul>
 <!-- ========= CONSTRUCTOR DETAIL ======== -->
 <ul class="blockList">
 <li class="blockList"><a name="constructor.detail">
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="LocalityBasedCandidateGenerator-org.apache.hadoop.hbase.master.MasterServices-">
+<a name="LocalityBasedCandidateGenerator--">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LocalityBasedCandidateGenerator</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#line.32">LocalityBasedCandidateGenerator</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#line.26">LocalityBasedCandidateGenerator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -261,7 +221,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>generate</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#line.37">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#line.29">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#generate-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">generate</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a></code></dd>
@@ -274,30 +234,21 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>tryMoveOrSwap</h4>
-<pre>private&nbsp;org.apache.hbase.thirdparty.com.google.common.base.Optional&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#line.63">tryMoveOrSwap</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
-                                                                                                                   int&nbsp;fromServer,
-                                                                                                                   int&nbsp;fromRegion,
-                                                                                                                   int&nbsp;toServer)</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#line.51">tryMoveOrSwap</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+                                                                int&nbsp;fromServer,
+                                                                int&nbsp;fromRegion,
+                                                                int&nbsp;toServer)</pre>
 </li>
 </ul>
 <a name="getWeightedLocality-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">
 <!--   -->
 </a>
-<ul class="blockList">
-<li class="blockList">
-<h4>getWeightedLocality</h4>
-<pre>private&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#line.84">getWeightedLocality</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
-                                   int&nbsp;region,
-                                   int&nbsp;server)</pre>
-</li>
-</ul>
-<a name="setServices-org.apache.hadoop.hbase.master.MasterServices-">
-<!--   -->
-</a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>setServices</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#line.89">setServices</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;services)</pre>
+<h4>getWeightedLocality</h4>
+<pre>private&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#line.77">getWeightedLocality</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+                                   int&nbsp;region,
+                                   int&nbsp;server)</pre>
 </li>
 </ul>
 </li>
@@ -354,13 +305,13 @@
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
 <li>Nested&nbsp;|&nbsp;</li>
-<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li>Field&nbsp;|&nbsp;</li>
 <li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.summary">Method</a></li>
 </ul>
 <ul class="subNavList">
 <li>Detail:&nbsp;</li>
-<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li>Field&nbsp;|&nbsp;</li>
 <li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.detail">Method</a></li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/RegionReplicaCandidateGenerator.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/RegionReplicaCandidateGenerator.html
index d9b715b..697168a 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/RegionReplicaCandidateGenerator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/RegionReplicaCandidateGenerator.html
@@ -196,7 +196,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getRandomIterationOrder-int-">getRandomIterationOrder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
index d006467..32675a8 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
@@ -128,7 +128,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1269">StochasticLoadBalancer.CPRequestCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1266">StochasticLoadBalancer.CPRequestCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadAsRateFunction</a></pre>
 <div class="block">Compute the cost of total number of coprocessor requests  The more unbalanced the higher the
  computed cost will be.  This uses a rolling average of regionload.</div>
@@ -250,7 +250,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>CP_REQUEST_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1271">CP_REQUEST_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1268">CP_REQUEST_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.CPRequestCostFunction.CP_REQUEST_COST_KEY">Constant Field Values</a></dd>
@@ -263,7 +263,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_CP_REQUEST_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1273">DEFAULT_CP_REQUEST_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1270">DEFAULT_CP_REQUEST_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.CPRequestCostFunction.DEFAULT_CP_REQUEST_COST">Constant Field Values</a></dd>
@@ -284,7 +284,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CPRequestCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1275">CPRequestCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1272">CPRequestCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -301,7 +301,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCostFromRl</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1281">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1278">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#getCostFromRl-org.apache.hadoop.hbase.master.balancer.BalancerRegionLoad-">getCostFromRl</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
index 6f0a6f4..b3838a9 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
@@ -127,7 +127,7 @@
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1218">StochasticLoadBalancer.CostFromRegionLoadAsRateFunction</a>
+<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1215">StochasticLoadBalancer.CostFromRegionLoadAsRateFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></pre>
 <div class="block">Class to be used for the subset of RegionLoad costs that should be treated as rates.
  We do not compare about the actual rate in requests per second but rather the rate relative
@@ -228,7 +228,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CostFromRegionLoadAsRateFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html#line.1220">CostFromRegionLoadAsRateFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html#line.1217">CostFromRegionLoadAsRateFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -245,7 +245,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRegionLoadCost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html#line.1225">getRegionLoadCost</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&nbsp;regionLoadList)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html#line.1222">getRegionLoadCost</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&nbsp;regionLoadList)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#getRegionLoadCost-java.util.Collection-">getRegionLoadCost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
index 262c5b5..f77c3d8 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
@@ -122,7 +122,7 @@
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1153">StochasticLoadBalancer.CostFromRegionLoadFunction</a>
+<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1150">StochasticLoadBalancer.CostFromRegionLoadFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">Base class the allows writing costs functions from rolling average of some
  number from RegionLoad.</div>
@@ -250,7 +250,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>clusterStatus</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1155">clusterStatus</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1152">clusterStatus</a></pre>
 </li>
 </ul>
 <a name="loads">
@@ -259,7 +259,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>loads</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1156">loads</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1153">loads</a></pre>
 </li>
 </ul>
 <a name="stats">
@@ -268,7 +268,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>stats</h4>
-<pre>private&nbsp;double[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1157">stats</a></pre>
+<pre>private&nbsp;double[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1154">stats</a></pre>
 </li>
 </ul>
 </li>
@@ -285,7 +285,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CostFromRegionLoadFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1158">CostFromRegionLoadFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1155">CostFromRegionLoadFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -302,7 +302,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterMetrics</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1162">setClusterMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;status)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1159">setClusterMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;status)</pre>
 </li>
 </ul>
 <a name="setLoads-java.util.Map-">
@@ -311,7 +311,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setLoads</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1166">setLoads</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&gt;&nbsp;l)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1163">setLoads</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&gt;&nbsp;l)</pre>
 </li>
 </ul>
 <a name="cost--">
@@ -320,7 +320,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>cost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1171">cost</a>()</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1168">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
@@ -333,7 +333,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionLoadCost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1202">getRegionLoadCost</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&nbsp;regionLoadList)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1199">getRegionLoadCost</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&nbsp;regionLoadList)</pre>
 </li>
 </ul>
 <a name="getCostFromRl-org.apache.hadoop.hbase.master.balancer.BalancerRegionLoad-">
@@ -342,7 +342,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCostFromRl</h4>
-<pre>protected abstract&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1210">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
+<pre>protected abstract&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1207">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
index db5bb74..49eed23 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
@@ -117,7 +117,7 @@
 </dl>
 <hr>
 <br>
-<pre>public abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.756">StochasticLoadBalancer.CostFunction</a>
+<pre>public abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.753">StochasticLoadBalancer.CostFunction</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Base class of StochasticLoadBalancer's Cost Functions.</div>
 </li>
@@ -258,7 +258,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>multiplier</h4>
-<pre>private&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.758">multiplier</a></pre>
+<pre>private&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.755">multiplier</a></pre>
 </li>
 </ul>
 <a name="cluster">
@@ -267,7 +267,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cluster</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.760">cluster</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.757">cluster</a></pre>
 </li>
 </ul>
 </li>
@@ -284,7 +284,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CostFunction</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.762">CostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;c)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.759">CostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;c)</pre>
 </li>
 </ul>
 </li>
@@ -301,7 +301,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>isNeeded</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.765">isNeeded</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.762">isNeeded</a>()</pre>
 </li>
 </ul>
 <a name="getMultiplier--">
@@ -310,7 +310,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getMultiplier</h4>
-<pre>float&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.768">getMultiplier</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.765">getMultiplier</a>()</pre>
 </li>
 </ul>
 <a name="setMultiplier-float-">
@@ -319,7 +319,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setMultiplier</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.772">setMultiplier</a>(float&nbsp;m)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.769">setMultiplier</a>(float&nbsp;m)</pre>
 </li>
 </ul>
 <a name="init-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">
@@ -328,7 +328,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.779">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.776">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <div class="block">Called once per LB invocation to give the cost function
  to initialize it's state, and perform any costly calculation.</div>
 </li>
@@ -339,7 +339,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postAction</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.787">postAction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;action)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.784">postAction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;action)</pre>
 <div class="block">Called once per cluster Action to give the cost function
  an opportunity to update it's state. postAction() is always
  called at least once before cost() is called with the cluster
@@ -352,7 +352,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>regionMoved</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.808">regionMoved</a>(int&nbsp;region,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.805">regionMoved</a>(int&nbsp;region,
                            int&nbsp;oldServer,
                            int&nbsp;newServer)</pre>
 </li>
@@ -363,7 +363,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>cost</h4>
-<pre>protected abstract&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.811">cost</a>()</pre>
+<pre>protected abstract&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.808">cost</a>()</pre>
 </li>
 </ul>
 <a name="costFromArray-double:A-">
@@ -372,7 +372,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>costFromArray</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.823">costFromArray</a>(double[]&nbsp;stats)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.820">costFromArray</a>(double[]&nbsp;stats)</pre>
 </li>
 </ul>
 <a name="getSum-double:A-">
@@ -381,7 +381,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getSum</h4>
-<pre>private&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.857">getSum</a>(double[]&nbsp;stats)</pre>
+<pre>private&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.854">getSum</a>(double[]&nbsp;stats)</pre>
 </li>
 </ul>
 <a name="scale-double-double-double-">
@@ -390,7 +390,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>scale</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.873">scale</a>(double&nbsp;min,
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.870">scale</a>(double&nbsp;min,
                        double&nbsp;max,
                        double&nbsp;value)</pre>
 <div class="block">Scale the value between 0 and 1.</div>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
index c18f5ac..4a57b2e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
@@ -122,7 +122,7 @@
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1057">StochasticLoadBalancer.LocalityBasedCostFunction</a>
+<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1054">StochasticLoadBalancer.LocalityBasedCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">Compute a cost of a potential cluster configuration based upon where
  <a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver"><code>HStoreFile</code></a>s are located.</div>
@@ -265,7 +265,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>type</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.LocalityType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1059">type</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.LocalityType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1056">type</a></pre>
 </li>
 </ul>
 <a name="bestLocality">
@@ -274,7 +274,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>bestLocality</h4>
-<pre>private&nbsp;double <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1061">bestLocality</a></pre>
+<pre>private&nbsp;double <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1058">bestLocality</a></pre>
 </li>
 </ul>
 <a name="locality">
@@ -283,7 +283,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>locality</h4>
-<pre>private&nbsp;double <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1062">locality</a></pre>
+<pre>private&nbsp;double <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1059">locality</a></pre>
 </li>
 </ul>
 </li>
@@ -300,7 +300,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LocalityBasedCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1064">LocalityBasedCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1061">LocalityBasedCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                           <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.LocalityType</a>&nbsp;type,
                           <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;localityCostKey,
                           float&nbsp;defaultLocalityCost)</pre>
@@ -320,7 +320,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>regionIndexToEntityIndex</h4>
-<pre>abstract&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1076">regionIndexToEntityIndex</a>(int&nbsp;region)</pre>
+<pre>abstract&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1073">regionIndexToEntityIndex</a>(int&nbsp;region)</pre>
 <div class="block">Maps region to the current entity (server or rack) on which it is stored</div>
 </li>
 </ul>
@@ -330,7 +330,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1079">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1076">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#init-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">StochasticLoadBalancer.CostFunction</a></code></span></div>
 <div class="block">Called once per LB invocation to give the cost function
  to initialize it's state, and perform any costly calculation.</div>
@@ -346,7 +346,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>regionMoved</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1096">regionMoved</a>(int&nbsp;region,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1093">regionMoved</a>(int&nbsp;region,
                            int&nbsp;oldServer,
                            int&nbsp;newServer)</pre>
 <dl>
@@ -361,7 +361,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>cost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1105">cost</a>()</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1102">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
@@ -374,7 +374,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getMostLocalEntityForRegion</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1109">getMostLocalEntityForRegion</a>(int&nbsp;region)</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1106">getMostLocalEntityForRegion</a>(int&nbsp;region)</pre>
 </li>
 </ul>
 <a name="getWeightedLocality-int-int-">
@@ -383,7 +383,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getWeightedLocality</h4>
-<pre>private&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1113">getWeightedLocality</a>(int&nbsp;region,
+<pre>private&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1110">getWeightedLocality</a>(int&nbsp;region,
                                    int&nbsp;entity)</pre>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
index 3acad4a..7e0c510 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
@@ -128,7 +128,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1473">StochasticLoadBalancer.MemStoreSizeCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1470">StochasticLoadBalancer.MemStoreSizeCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadAsRateFunction</a></pre>
 <div class="block">Compute the cost of total memstore size.  The more unbalanced the higher the
  computed cost will be.  This uses a rolling average of regionload.</div>
@@ -250,7 +250,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>MEMSTORE_SIZE_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1475">MEMSTORE_SIZE_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1472">MEMSTORE_SIZE_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MemStoreSizeCostFunction.MEMSTORE_SIZE_COST_KEY">Constant Field Values</a></dd>
@@ -263,7 +263,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_MEMSTORE_SIZE_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1477">DEFAULT_MEMSTORE_SIZE_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1474">DEFAULT_MEMSTORE_SIZE_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MemStoreSizeCostFunction.DEFAULT_MEMSTORE_SIZE_COST">Constant Field Values</a></dd>
@@ -284,7 +284,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MemStoreSizeCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1479">MemStoreSizeCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1476">MemStoreSizeCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -301,7 +301,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCostFromRl</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1485">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1482">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#getCostFromRl-org.apache.hadoop.hbase.master.balancer.BalancerRegionLoad-">getCostFromRl</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
index 8d928ac..8084f8b 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
@@ -118,7 +118,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.887">StochasticLoadBalancer.MoveCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.884">StochasticLoadBalancer.MoveCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">Given the starting state of the regions and a potential ending state
  compute cost based upon the number of regions that have moved.</div>
@@ -254,7 +254,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>MOVE_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.888">MOVE_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.885">MOVE_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MoveCostFunction.MOVE_COST_KEY">Constant Field Values</a></dd>
@@ -267,7 +267,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>MOVE_COST_OFFPEAK_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.889">MOVE_COST_OFFPEAK_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.886">MOVE_COST_OFFPEAK_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MoveCostFunction.MOVE_COST_OFFPEAK_KEY">Constant Field Values</a></dd>
@@ -280,7 +280,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_MOVES_PERCENT_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.891">MAX_MOVES_PERCENT_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.888">MAX_MOVES_PERCENT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MoveCostFunction.MAX_MOVES_PERCENT_KEY">Constant Field Values</a></dd>
@@ -293,7 +293,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_MOVE_COST</h4>
-<pre>static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.893">DEFAULT_MOVE_COST</a></pre>
+<pre>static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.890">DEFAULT_MOVE_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MoveCostFunction.DEFAULT_MOVE_COST">Constant Field Values</a></dd>
@@ -306,7 +306,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_MOVE_COST_OFFPEAK</h4>
-<pre>static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.894">DEFAULT_MOVE_COST_OFFPEAK</a></pre>
+<pre>static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.891">DEFAULT_MOVE_COST_OFFPEAK</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MoveCostFunction.DEFAULT_MOVE_COST_OFFPEAK">Constant Field Values</a></dd>
@@ -319,7 +319,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_MAX_MOVES</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.895">DEFAULT_MAX_MOVES</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.892">DEFAULT_MAX_MOVES</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MoveCostFunction.DEFAULT_MAX_MOVES">Constant Field Values</a></dd>
@@ -332,7 +332,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_MAX_MOVE_PERCENT</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.896">DEFAULT_MAX_MOVE_PERCENT</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.893">DEFAULT_MAX_MOVE_PERCENT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MoveCostFunction.DEFAULT_MAX_MOVE_PERCENT">Constant Field Values</a></dd>
@@ -345,7 +345,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>maxMovesPercent</h4>
-<pre>private final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.898">maxMovesPercent</a></pre>
+<pre>private final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.895">maxMovesPercent</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -354,7 +354,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.899">conf</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.896">conf</a></pre>
 </li>
 </ul>
 </li>
@@ -371,7 +371,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MoveCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.901">MoveCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.898">MoveCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -388,7 +388,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.913">cost</a>()</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.910">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
index 1ee9135..84cc3f9 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
@@ -118,7 +118,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.983">StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.980">StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">Compute the cost of a potential cluster state from skew in number of
  primary regions on a cluster.</div>
@@ -234,7 +234,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>PRIMARY_REGION_COUNT_SKEW_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.984">PRIMARY_REGION_COUNT_SKEW_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.981">PRIMARY_REGION_COUNT_SKEW_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.PRIMARY_REGION_COUNT_SKEW_COST_KEY">Constant Field Values</a></dd>
@@ -247,7 +247,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.986">DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.983">DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST">Constant Field Values</a></dd>
@@ -260,7 +260,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>stats</h4>
-<pre>private&nbsp;double[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.988">stats</a></pre>
+<pre>private&nbsp;double[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.985">stats</a></pre>
 </li>
 </ul>
 </li>
@@ -277,7 +277,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PrimaryRegionCountSkewCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.990">PrimaryRegionCountSkewCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.987">PrimaryRegionCountSkewCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -294,7 +294,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>isNeeded</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.998">isNeeded</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.995">isNeeded</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#isNeeded--">isNeeded</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
@@ -307,7 +307,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.1003">cost</a>()</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.1000">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
index 58504bb..657a566 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
@@ -123,7 +123,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1134">StochasticLoadBalancer.RackLocalityCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1131">StochasticLoadBalancer.RackLocalityCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.LocalityBasedCostFunction</a></pre>
 </li>
 </ul>
@@ -238,7 +238,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>RACK_LOCALITY_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1136">RACK_LOCALITY_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1133">RACK_LOCALITY_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RackLocalityCostFunction.RACK_LOCALITY_COST_KEY">Constant Field Values</a></dd>
@@ -251,7 +251,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_RACK_LOCALITY_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1137">DEFAULT_RACK_LOCALITY_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1134">DEFAULT_RACK_LOCALITY_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RackLocalityCostFunction.DEFAULT_RACK_LOCALITY_COST">Constant Field Values</a></dd>
@@ -272,7 +272,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RackLocalityCostFunction</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1139">RackLocalityCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1136">RackLocalityCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -289,7 +289,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionIndexToEntityIndex</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1144">regionIndexToEntityIndex</a>(int&nbsp;region)</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1141">regionIndexToEntityIndex</a>(int&nbsp;region)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#regionIndexToEntityIndex-int-">StochasticLoadBalancer.LocalityBasedCostFunction</a></code></span></div>
 <div class="block">Maps region to the current entity (server or rack) on which it is stored</div>
 <dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
index 0ee62a0..357ec4a 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
@@ -118,7 +118,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.706">StochasticLoadBalancer.RandomCandidateGenerator</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.703">StochasticLoadBalancer.RandomCandidateGenerator</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a></pre>
 </li>
 </ul>
@@ -165,7 +165,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getRandomIterationOrder-int-">getRandomIterationOrder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -194,7 +194,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomCandidateGenerator</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html#line.706">RandomCandidateGenerator</a>()</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html#line.703">RandomCandidateGenerator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -211,7 +211,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>generate</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html#line.709">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html#line.706">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#generate-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">generate</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
index c4a1781..40df131 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
@@ -128,7 +128,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1247">StochasticLoadBalancer.ReadRequestCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1244">StochasticLoadBalancer.ReadRequestCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadAsRateFunction</a></pre>
 <div class="block">Compute the cost of total number of read requests  The more unbalanced the higher the
  computed cost will be.  This uses a rolling average of regionload.</div>
@@ -250,7 +250,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>READ_REQUEST_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1249">READ_REQUEST_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1246">READ_REQUEST_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.ReadRequestCostFunction.READ_REQUEST_COST_KEY">Constant Field Values</a></dd>
@@ -263,7 +263,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_READ_REQUEST_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1251">DEFAULT_READ_REQUEST_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1248">DEFAULT_READ_REQUEST_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.ReadRequestCostFunction.DEFAULT_READ_REQUEST_COST">Constant Field Values</a></dd>
@@ -284,7 +284,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ReadRequestCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1253">ReadRequestCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1250">ReadRequestCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -301,7 +301,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCostFromRl</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1259">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1256">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#getCostFromRl-org.apache.hadoop.hbase.master.balancer.BalancerRegionLoad-">getCostFromRl</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
index 56d6b62..229e1bf 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
@@ -118,7 +118,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.941">StochasticLoadBalancer.RegionCountSkewCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.938">StochasticLoadBalancer.RegionCountSkewCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">Compute the cost of a potential cluster state from skew in number of
  regions on a cluster.</div>
@@ -237,7 +237,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>REGION_COUNT_SKEW_COST_KEY</h4>
-<pre>static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.942">REGION_COUNT_SKEW_COST_KEY</a></pre>
+<pre>static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.939">REGION_COUNT_SKEW_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RegionCountSkewCostFunction.REGION_COUNT_SKEW_COST_KEY">Constant Field Values</a></dd>
@@ -250,7 +250,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_REGION_COUNT_SKEW_COST</h4>
-<pre>static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.944">DEFAULT_REGION_COUNT_SKEW_COST</a></pre>
+<pre>static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.941">DEFAULT_REGION_COUNT_SKEW_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RegionCountSkewCostFunction.DEFAULT_REGION_COUNT_SKEW_COST">Constant Field Values</a></dd>
@@ -263,7 +263,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>stats</h4>
-<pre>private&nbsp;double[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.946">stats</a></pre>
+<pre>private&nbsp;double[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.943">stats</a></pre>
 </li>
 </ul>
 </li>
@@ -280,7 +280,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionCountSkewCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.948">RegionCountSkewCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.945">RegionCountSkewCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -297,7 +297,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.955">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.952">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#init-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">StochasticLoadBalancer.CostFunction</a></code></span></div>
 <div class="block">Called once per LB invocation to give the cost function
  to initialize it's state, and perform any costly calculation.</div>
@@ -313,7 +313,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.968">cost</a>()</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.965">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
index a505baa..638020f 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
@@ -122,7 +122,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1313">StochasticLoadBalancer.RegionReplicaHostCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1310">StochasticLoadBalancer.RegionReplicaHostCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">A cost function for region replicas. We give a very high cost to hosting
  replicas of the same region in the same host. We do not prevent the case
@@ -272,7 +272,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>REGION_REPLICA_HOST_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1314">REGION_REPLICA_HOST_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1311">REGION_REPLICA_HOST_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RegionReplicaHostCostFunction.REGION_REPLICA_HOST_COST_KEY">Constant Field Values</a></dd>
@@ -285,7 +285,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_REGION_REPLICA_HOST_COST_KEY</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1316">DEFAULT_REGION_REPLICA_HOST_COST_KEY</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1313">DEFAULT_REGION_REPLICA_HOST_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RegionReplicaHostCostFunction.DEFAULT_REGION_REPLICA_HOST_COST_KEY">Constant Field Values</a></dd>
@@ -298,7 +298,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>maxCost</h4>
-<pre>long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1318">maxCost</a></pre>
+<pre>long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1315">maxCost</a></pre>
 </li>
 </ul>
 <a name="costsPerGroup">
@@ -307,7 +307,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>costsPerGroup</h4>
-<pre>long[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1319">costsPerGroup</a></pre>
+<pre>long[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1316">costsPerGroup</a></pre>
 </li>
 </ul>
 <a name="primariesOfRegionsPerGroup">
@@ -316,7 +316,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>primariesOfRegionsPerGroup</h4>
-<pre>int[][] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1320">primariesOfRegionsPerGroup</a></pre>
+<pre>int[][] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1317">primariesOfRegionsPerGroup</a></pre>
 </li>
 </ul>
 </li>
@@ -333,7 +333,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionReplicaHostCostFunction</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1322">RegionReplicaHostCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1319">RegionReplicaHostCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -350,7 +350,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1329">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1326">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#init-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">StochasticLoadBalancer.CostFunction</a></code></span></div>
 <div class="block">Called once per LB invocation to give the cost function
  to initialize it's state, and perform any costly calculation.</div>
@@ -366,7 +366,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxCost</h4>
-<pre>long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1342">getMaxCost</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1339">getMaxCost</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 </li>
 </ul>
 <a name="isNeeded--">
@@ -375,7 +375,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>isNeeded</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1358">isNeeded</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1355">isNeeded</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#isNeeded--">isNeeded</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
@@ -388,7 +388,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>cost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1363">cost</a>()</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1360">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
@@ -401,7 +401,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>costPerGroup</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1383">costPerGroup</a>(int[]&nbsp;primariesOfRegions)</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1380">costPerGroup</a>(int[]&nbsp;primariesOfRegions)</pre>
 <div class="block">For each primary region, it computes the total number of replicas in the array (numReplicas)
  and returns a sum of numReplicas-1 squared. For example, if the server hosts
  regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it
@@ -420,7 +420,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionMoved</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1406">regionMoved</a>(int&nbsp;region,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1403">regionMoved</a>(int&nbsp;region,
                            int&nbsp;oldServer,
                            int&nbsp;newServer)</pre>
 <dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
index a6631d2..f7222e5 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
@@ -123,7 +123,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.724">StochasticLoadBalancer.RegionReplicaRackCandidateGenerator</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.721">StochasticLoadBalancer.RegionReplicaRackCandidateGenerator</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/RegionReplicaCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">RegionReplicaCandidateGenerator</a></pre>
 <div class="block">Generates candidates which moves the replicas out of the rack for
  co-hosted region replicas in the same rack</div>
@@ -194,7 +194,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getRandomIterationOrder-int-">getRandomIterationOrder</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#getAction-int-int-int-int-">getAction</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -223,7 +223,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionReplicaRackCandidateGenerator</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html#line.724">RegionReplicaRackCandidateGenerator</a>()</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html#line.721">RegionReplicaRackCandidateGenerator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -240,7 +240,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>generate</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html#line.726">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html#line.723">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/RegionReplicaCandidateGenerator.html#generate-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">generate</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/RegionReplicaCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">RegionReplicaCandidateGenerator</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
index cc59677..6c60333 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
@@ -123,7 +123,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1429">StochasticLoadBalancer.RegionReplicaRackCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1426">StochasticLoadBalancer.RegionReplicaRackCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.RegionReplicaHostCostFunction</a></pre>
 <div class="block">A cost function for region replicas for the rack distribution. We give a relatively high
  cost to hosting replicas of the same region in the same rack. We do not prevent the case
@@ -255,7 +255,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>REGION_REPLICA_RACK_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1430">REGION_REPLICA_RACK_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1427">REGION_REPLICA_RACK_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RegionReplicaRackCostFunction.REGION_REPLICA_RACK_COST_KEY">Constant Field Values</a></dd>
@@ -268,7 +268,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_REGION_REPLICA_RACK_COST_KEY</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1432">DEFAULT_REGION_REPLICA_RACK_COST_KEY</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1429">DEFAULT_REGION_REPLICA_RACK_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RegionReplicaRackCostFunction.DEFAULT_REGION_REPLICA_RACK_COST_KEY">Constant Field Values</a></dd>
@@ -289,7 +289,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionReplicaRackCostFunction</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1434">RegionReplicaRackCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1431">RegionReplicaRackCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -306,7 +306,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1441">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1438">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#init-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">StochasticLoadBalancer.CostFunction</a></code></span></div>
 <div class="block">Called once per LB invocation to give the cost function
  to initialize it's state, and perform any costly calculation.</div>
@@ -322,7 +322,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionMoved</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1456">regionMoved</a>(int&nbsp;region,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1453">regionMoved</a>(int&nbsp;region,
                            int&nbsp;oldServer,
                            int&nbsp;newServer)</pre>
 <dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
index c5a4a64..342431b 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
@@ -123,7 +123,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1119">StochasticLoadBalancer.ServerLocalityCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1116">StochasticLoadBalancer.ServerLocalityCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.LocalityBasedCostFunction</a></pre>
 </li>
 </ul>
@@ -238,7 +238,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>LOCALITY_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1121">LOCALITY_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1118">LOCALITY_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.ServerLocalityCostFunction.LOCALITY_COST_KEY">Constant Field Values</a></dd>
@@ -251,7 +251,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_LOCALITY_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1122">DEFAULT_LOCALITY_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1119">DEFAULT_LOCALITY_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.ServerLocalityCostFunction.DEFAULT_LOCALITY_COST">Constant Field Values</a></dd>
@@ -272,7 +272,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ServerLocalityCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1124">ServerLocalityCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1121">ServerLocalityCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -289,7 +289,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionIndexToEntityIndex</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1129">regionIndexToEntityIndex</a>(int&nbsp;region)</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1126">regionIndexToEntityIndex</a>(int&nbsp;region)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#regionIndexToEntityIndex-int-">StochasticLoadBalancer.LocalityBasedCostFunction</a></code></span></div>
 <div class="block">Maps region to the current entity (server or rack) on which it is stored</div>
 <dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
index 27305f4..cd8b68a 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
@@ -123,7 +123,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1494">StochasticLoadBalancer.StoreFileCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1491">StochasticLoadBalancer.StoreFileCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></pre>
 <div class="block">Compute the cost of total open storefiles size.  The more unbalanced the higher the
  computed cost will be.  This uses a rolling average of regionload.</div>
@@ -238,7 +238,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>STOREFILE_SIZE_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1496">STOREFILE_SIZE_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1493">STOREFILE_SIZE_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.StoreFileCostFunction.STOREFILE_SIZE_COST_KEY">Constant Field Values</a></dd>
@@ -251,7 +251,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_STOREFILE_SIZE_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1498">DEFAULT_STOREFILE_SIZE_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1495">DEFAULT_STOREFILE_SIZE_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.StoreFileCostFunction.DEFAULT_STOREFILE_SIZE_COST">Constant Field Values</a></dd>
@@ -272,7 +272,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>StoreFileCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1500">StoreFileCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1497">StoreFileCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -289,7 +289,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCostFromRl</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1506">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1503">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#getCostFromRl-org.apache.hadoop.hbase.master.balancer.BalancerRegionLoad-">getCostFromRl</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
index a63d9d1..07974e0 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
@@ -118,7 +118,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1028">StochasticLoadBalancer.TableSkewCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1025">StochasticLoadBalancer.TableSkewCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">Compute the cost of a potential cluster configuration based upon how evenly
  distributed tables are.</div>
@@ -226,7 +226,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>TABLE_SKEW_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1030">TABLE_SKEW_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1027">TABLE_SKEW_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.TableSkewCostFunction.TABLE_SKEW_COST_KEY">Constant Field Values</a></dd>
@@ -239,7 +239,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_TABLE_SKEW_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1032">DEFAULT_TABLE_SKEW_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1029">DEFAULT_TABLE_SKEW_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.TableSkewCostFunction.DEFAULT_TABLE_SKEW_COST">Constant Field Values</a></dd>
@@ -260,7 +260,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TableSkewCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1034">TableSkewCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1031">TableSkewCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -277,7 +277,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1040">cost</a>()</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1037">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
index f695233..8c5006a 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
@@ -128,7 +128,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1290">StochasticLoadBalancer.WriteRequestCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1287">StochasticLoadBalancer.WriteRequestCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadAsRateFunction</a></pre>
 <div class="block">Compute the cost of total number of write requests.  The more unbalanced the higher the
  computed cost will be.  This uses a rolling average of regionload.</div>
@@ -250,7 +250,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>WRITE_REQUEST_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1292">WRITE_REQUEST_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1289">WRITE_REQUEST_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.WriteRequestCostFunction.WRITE_REQUEST_COST_KEY">Constant Field Values</a></dd>
@@ -263,7 +263,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_WRITE_REQUEST_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1294">DEFAULT_WRITE_REQUEST_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1291">DEFAULT_WRITE_REQUEST_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.WriteRequestCostFunction.DEFAULT_WRITE_REQUEST_COST">Constant Field Values</a></dd>
@@ -284,7 +284,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WriteRequestCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1296">WriteRequestCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1293">WriteRequestCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -301,7 +301,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCostFromRl</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1302">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1299">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#getCostFromRl-org.apache.hadoop.hbase.master.balancer.BalancerRegionLoad-">getCostFromRl</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
index 19d8d88..6c15f97 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -123,7 +123,7 @@
 <hr>
 <br>
 <pre>@InterfaceAudience.LimitedPrivate(value="Configuration")
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.113">StochasticLoadBalancer</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.112">StochasticLoadBalancer</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer</a></pre>
 <div class="block"><p>This is a best effort load balancer. Given a Cost function F(C) =&gt; x It will
  randomly try and mutate the cluster to Cprime. If F(Cprime) &lt; F(C) then the
@@ -599,37 +599,31 @@
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
 <tr id="i18" class="altColor">
-<td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</code>
-<div class="block">Set the master service.</div>
-</td>
-</tr>
-<tr id="i19" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#setSlop-org.apache.hadoop.conf.Configuration-">setSlop</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#totalCostsPerFunc--">totalCostsPerFunc</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#updateCostsWithAction-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action-">updateCostsWithAction</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                      <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;action)</code>&nbsp;</td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#updateMetricsSize-int-">updateMetricsSize</a></span>(int&nbsp;size)</code>
 <div class="block">Update the number of metrics that are reported to JMX</div>
 </td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#updateRegionLoad--">updateRegionLoad</a></span>()</code>
 <div class="block">Store the current region loads.</div>
 </td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#updateStochasticCosts-org.apache.hadoop.hbase.TableName-java.lang.Double-java.lang.Double:A-">updateStochasticCosts</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html?is-external=true" title="class or interface in java.lang">Double</a>&nbsp;overall,
@@ -643,7 +637,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterSystemRegions-java.util.Collection-java.util.List-">assignMasterSystemRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#balanceCluster-java.util.Map-">balanceCluster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#balanceMasterRegions-java.util.Map-">balanceMasterRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-">createCluster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getConf--">getConf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getRegionAssignmentsByServer-java.util.Collection-">getRegionAssignmentsByServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#idleRegionServerExist-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">idleRegionServerExist</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#initialize--">initialize</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#isStopped--">isStopped</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setRackManager-org.apache.hadoop.hbase.master.RackManager-">setRackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster-org.apache.hadoop.hbase.client.RegionInfo-">shouldBeOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#stop-java.lang.String-">stop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#updateBalancerStatus-boolean-">updateBalancerStatus</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterSystemRegions-java.util.Collection-java.util.List-">assignMasterSystemRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#balanceCluster-java.util.Map-">balanceCluster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#balanceMasterRegions-java.util.Map-">balanceMasterRegions</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#createCluster-java.util.List-java.util.Collection-">createCluster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getConf--">getConf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getRegionAssignmentsByServer-java.util.Collection-">getRegionAssignmentsByServer</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#idleRegionServerExist-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">idleRegionServerExist</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#initialize--">initialize</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#isStopped--">isStopped</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#postMasterStartupInitialize--">postMasterStartupInitialize</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setRackManager-org.apache.hadoop.hbase.master.RackManager-">setRackManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster-org.apache.hadoop.hbase.client.RegionInfo-">shouldBeOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#stop-java.lang.String-">stop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#updateBalancerStatus-boolean-">updateBalancerStatus</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -679,7 +673,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>STEPS_PER_REGION_KEY</h4>
-<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.115">STEPS_PER_REGION_KEY</a></pre>
+<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.114">STEPS_PER_REGION_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.STEPS_PER_REGION_KEY">Constant Field Values</a></dd>
@@ -692,7 +686,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_STEPS_KEY</h4>
-<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.117">MAX_STEPS_KEY</a></pre>
+<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.116">MAX_STEPS_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MAX_STEPS_KEY">Constant Field Values</a></dd>
@@ -705,7 +699,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>RUN_MAX_STEPS_KEY</h4>
-<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.119">RUN_MAX_STEPS_KEY</a></pre>
+<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.118">RUN_MAX_STEPS_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RUN_MAX_STEPS_KEY">Constant Field Values</a></dd>
@@ -718,7 +712,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_RUNNING_TIME_KEY</h4>
-<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.121">MAX_RUNNING_TIME_KEY</a></pre>
+<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.120">MAX_RUNNING_TIME_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MAX_RUNNING_TIME_KEY">Constant Field Values</a></dd>
@@ -731,7 +725,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>KEEP_REGION_LOADS</h4>
-<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.123">KEEP_REGION_LOADS</a></pre>
+<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.122">KEEP_REGION_LOADS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.KEEP_REGION_LOADS">Constant Field Values</a></dd>
@@ -744,7 +738,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>TABLE_FUNCTION_SEP</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.125">TABLE_FUNCTION_SEP</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.124">TABLE_FUNCTION_SEP</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.TABLE_FUNCTION_SEP">Constant Field Values</a></dd>
@@ -757,7 +751,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>MIN_COST_NEED_BALANCE_KEY</h4>
-<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.126">MIN_COST_NEED_BALANCE_KEY</a></pre>
+<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.125">MIN_COST_NEED_BALANCE_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MIN_COST_NEED_BALANCE_KEY">Constant Field Values</a></dd>
@@ -770,7 +764,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>COST_FUNCTIONS_COST_FUNCTIONS_KEY</h4>
-<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.128">COST_FUNCTIONS_COST_FUNCTIONS_KEY</a></pre>
+<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.127">COST_FUNCTIONS_COST_FUNCTIONS_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.COST_FUNCTIONS_COST_FUNCTIONS_KEY">Constant Field Values</a></dd>
@@ -783,7 +777,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>RANDOM</h4>
-<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.131">RANDOM</a></pre>
+<pre>protected static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.130">RANDOM</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -792,7 +786,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.132">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.131">LOG</a></pre>
 </li>
 </ul>
 <a name="loads">
@@ -801,7 +795,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>loads</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.134">loads</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.133">loads</a></pre>
 </li>
 </ul>
 <a name="maxSteps">
@@ -810,7 +804,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>maxSteps</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.137">maxSteps</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.136">maxSteps</a></pre>
 </li>
 </ul>
 <a name="runMaxSteps">
@@ -819,7 +813,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>runMaxSteps</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.138">runMaxSteps</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.137">runMaxSteps</a></pre>
 </li>
 </ul>
 <a name="stepsPerRegion">
@@ -828,7 +822,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>stepsPerRegion</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.139">stepsPerRegion</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.138">stepsPerRegion</a></pre>
 </li>
 </ul>
 <a name="maxRunningTime">
@@ -837,7 +831,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>maxRunningTime</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.140">maxRunningTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.139">maxRunningTime</a></pre>
 </li>
 </ul>
 <a name="numRegionLoadsToRemember">
@@ -846,7 +840,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>numRegionLoadsToRemember</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.141">numRegionLoadsToRemember</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.140">numRegionLoadsToRemember</a></pre>
 </li>
 </ul>
 <a name="minCostNeedBalance">
@@ -855,7 +849,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>minCostNeedBalance</h4>
-<pre>private&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.142">minCostNeedBalance</a></pre>
+<pre>private&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.141">minCostNeedBalance</a></pre>
 </li>
 </ul>
 <a name="candidateGenerators">
@@ -864,7 +858,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>candidateGenerators</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.144">candidateGenerators</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.143">candidateGenerators</a></pre>
 </li>
 </ul>
 <a name="regionLoadFunctions">
@@ -873,7 +867,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>regionLoadFunctions</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.145">regionLoadFunctions</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.144">regionLoadFunctions</a></pre>
 </li>
 </ul>
 <a name="costFunctions">
@@ -882,7 +876,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>costFunctions</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.146">costFunctions</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.145">costFunctions</a></pre>
 </li>
 </ul>
 <a name="curOverallCost">
@@ -891,7 +885,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>curOverallCost</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html?is-external=true" title="class or interface in java.lang">Double</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.149">curOverallCost</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html?is-external=true" title="class or interface in java.lang">Double</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.148">curOverallCost</a></pre>
 </li>
 </ul>
 <a name="tempFunctionCosts">
@@ -900,7 +894,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>tempFunctionCosts</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html?is-external=true" title="class or interface in java.lang">Double</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.150">tempFunctionCosts</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html?is-external=true" title="class or interface in java.lang">Double</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.149">tempFunctionCosts</a></pre>
 </li>
 </ul>
 <a name="curFunctionCosts">
@@ -909,7 +903,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>curFunctionCosts</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html?is-external=true" title="class or interface in java.lang">Double</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.151">curFunctionCosts</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html?is-external=true" title="class or interface in java.lang">Double</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.150">curFunctionCosts</a></pre>
 </li>
 </ul>
 <a name="localityCandidateGenerator">
@@ -918,7 +912,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>localityCandidateGenerator</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">LocalityBasedCandidateGenerator</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.155">localityCandidateGenerator</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">LocalityBasedCandidateGenerator</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.154">localityCandidateGenerator</a></pre>
 </li>
 </ul>
 <a name="localityCost">
@@ -927,7 +921,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>localityCost</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.ServerLocalityCostFunction</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.156">localityCost</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.ServerLocalityCostFunction</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.155">localityCost</a></pre>
 </li>
 </ul>
 <a name="rackLocalityCost">
@@ -936,7 +930,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>rackLocalityCost</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.RackLocalityCostFunction</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.157">rackLocalityCost</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.RackLocalityCostFunction</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.156">rackLocalityCost</a></pre>
 </li>
 </ul>
 <a name="regionReplicaHostCostFunction">
@@ -945,7 +939,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>regionReplicaHostCostFunction</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.RegionReplicaHostCostFunction</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.158">regionReplicaHostCostFunction</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.RegionReplicaHostCostFunction</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.157">regionReplicaHostCostFunction</a></pre>
 </li>
 </ul>
 <a name="regionReplicaRackCostFunction">
@@ -954,7 +948,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>regionReplicaRackCostFunction</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.RegionReplicaRackCostFunction</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.159">regionReplicaRackCostFunction</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.RegionReplicaRackCostFunction</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.158">regionReplicaRackCostFunction</a></pre>
 </li>
 </ul>
 <a name="namedQueueRecorder">
@@ -963,7 +957,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>namedQueueRecorder</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/namequeues/NamedQueueRecorder.html" title="class in org.apache.hadoop.hbase.namequeues">NamedQueueRecorder</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.164">namedQueueRecorder</a></pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/namequeues/NamedQueueRecorder.html" title="class in org.apache.hadoop.hbase.namequeues">NamedQueueRecorder</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.163">namedQueueRecorder</a></pre>
 <div class="block">Use to add balancer decision history to ring-buffer</div>
 </li>
 </ul>
@@ -981,7 +975,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>StochasticLoadBalancer</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.170">StochasticLoadBalancer</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.169">StochasticLoadBalancer</a>()</pre>
 <div class="block">The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its
  default MetricsBalancer</div>
 </li>
@@ -1000,7 +994,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>onConfigurationChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.175">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.174">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">LoadBalancer</a></code></span></div>
 <div class="block">Notification that config has changed</div>
 <dl>
@@ -1019,7 +1013,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setConf</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.180">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.179">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>setConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -1034,7 +1028,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>loadCustomCostFunctions</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.243">loadCustomCostFunctions</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.242">loadCustomCostFunctions</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 <a name="setCandidateGenerators-java.util.List-">
@@ -1043,7 +1037,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setCandidateGenerators</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.267">setCandidateGenerators</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a>&gt;&nbsp;customCandidateGenerators)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.266">setCandidateGenerators</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a>&gt;&nbsp;customCandidateGenerators)</pre>
 </li>
 </ul>
 <a name="getCandidateGenerators--">
@@ -1052,7 +1046,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCandidateGenerators</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.274">getCandidateGenerators</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">CandidateGenerator</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.273">getCandidateGenerators</a>()</pre>
 <div class="block">Exposed for Testing!</div>
 </li>
 </ul>
@@ -1062,7 +1056,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setSlop</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.279">setSlop</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.278">setSlop</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setSlop-org.apache.hadoop.conf.Configuration-">setSlop</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer</a></code></dd>
@@ -1075,7 +1069,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterMetrics</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.284">setClusterMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;st)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.283">setClusterMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;st)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">LoadBalancer</a></code></span></div>
 <div class="block">Set the current cluster status. This allows a LoadBalancer to map host name to a server</div>
 <dl>
@@ -1092,34 +1086,17 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>updateMetricsSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.306">updateMetricsSize</a>(int&nbsp;size)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.305">updateMetricsSize</a>(int&nbsp;size)</pre>
 <div class="block">Update the number of metrics that are reported to JMX</div>
 </li>
 </ul>
-<a name="setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>setMasterServices</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.313">setMasterServices</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
-<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">LoadBalancer</a></code></span></div>
-<div class="block">Set the master service.</div>
-<dl>
-<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a></code></dd>
-<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer</a></code></dd>
-</dl>
-</li>
-</ul>
 <a name="areSomeRegionReplicasColocated-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>areSomeRegionReplicasColocated</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.319">areSomeRegionReplicasColocated</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;c)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.312">areSomeRegionReplicasColocated</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;c)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#areSomeRegionReplicasColocated-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">BaseLoadBalancer</a></code></span></div>
 <div class="block">Subclasses should implement this to return true if the cluster has nodes that hosts
  multiple replicas for the same region, or, if there are multiple racks and the same
@@ -1140,7 +1117,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>needsBalance</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.328">needsBalance</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.325">needsBalance</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -1154,7 +1131,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>nextAction</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.375">nextAction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.372">nextAction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 </li>
 </ul>
 <a name="balanceTable-org.apache.hadoop.hbase.TableName-java.util.Map-">
@@ -1163,7 +1140,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceTable</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.385">balanceTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.382">balanceTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;loadOfOneTable)</pre>
 <div class="block">Given the cluster state this will try and approach an optimal balance. This
  should always approach the optimal state given enough steps.</div>
@@ -1186,7 +1163,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>sendRegionPlansToRingBuffer</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.506">sendRegionPlansToRingBuffer</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;plans,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.503">sendRegionPlansToRingBuffer</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;plans,
                                          double&nbsp;currentCost,
                                          double&nbsp;initCost,
                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;initFunctionTotalCosts,
@@ -1199,7 +1176,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>updateStochasticCosts</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.530">updateStochasticCosts</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.527">updateStochasticCosts</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html?is-external=true" title="class or interface in java.lang">Double</a>&nbsp;overall,
                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html?is-external=true" title="class or interface in java.lang">Double</a>[]&nbsp;subCosts)</pre>
 <div class="block">update costs to JMX</div>
@@ -1211,7 +1188,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>addCostFunction</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.552">addCostFunction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a>&nbsp;costFunction)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.549">addCostFunction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a>&nbsp;costFunction)</pre>
 </li>
 </ul>
 <a name="functionCost--">
@@ -1220,7 +1197,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>functionCost</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.558">functionCost</a>()</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.555">functionCost</a>()</pre>
 </li>
 </ul>
 <a name="totalCostsPerFunc--">
@@ -1229,7 +1206,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>totalCostsPerFunc</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.571">totalCostsPerFunc</a>()</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.568">totalCostsPerFunc</a>()</pre>
 </li>
 </ul>
 <a name="createRegionPlans-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">
@@ -1238,7 +1215,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>createRegionPlans</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.595">createRegionPlans</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.592">createRegionPlans</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <div class="block">Create all of the RegionPlan's needed to move from the initial cluster state to the desired
  state.</div>
 <dl>
@@ -1255,7 +1232,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>updateRegionLoad</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.621">updateRegionLoad</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.618">updateRegionLoad</a>()</pre>
 <div class="block">Store the current region loads.</div>
 </li>
 </ul>
@@ -1265,7 +1242,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>initCosts</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.646">initCosts</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.643">initCosts</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 </li>
 </ul>
 <a name="updateCostsWithAction-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action-">
@@ -1274,7 +1251,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>updateCostsWithAction</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.652">updateCostsWithAction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.649">updateCostsWithAction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                      <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;action)</pre>
 </li>
 </ul>
@@ -1284,7 +1261,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCostFunctionNames</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.661">getCostFunctionNames</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.658">getCostFunctionNames</a>()</pre>
 <div class="block">Get the names of the cost functions</div>
 </li>
 </ul>
@@ -1294,7 +1271,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>computeCost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.681">computeCost</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.678">computeCost</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                              double&nbsp;previousCost)</pre>
 <div class="block">This is the main cost function.  It will compute a cost associated with a proposed cluster
  state.  All different costs will be combined with their multipliers to produce a double cost.</div>
@@ -1314,7 +1291,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>composeAttributeName</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1514">composeAttributeName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1511">composeAttributeName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
                                           <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;costFunctionName)</pre>
 <div class="block">A helper function to compose the attribute name from tablename and costfunction name</div>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.Action.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.Action.html
index f74bffd..1619f5f 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.Action.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.Action.html
@@ -213,7 +213,7 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>private org.apache.hbase.thirdparty.com.google.common.base.Optional&lt;<a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&gt;</code></td>
+<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">LocalityBasedCandidateGenerator.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#tryMoveOrSwap-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-int-">tryMoveOrSwap</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
              int&nbsp;fromServer,
              int&nbsp;fromRegion,
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.html
index ccc2510..80660d7 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/BaseLoadBalancer.Cluster.html
@@ -335,7 +335,7 @@
 </td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private org.apache.hbase.thirdparty.com.google.common.base.Optional&lt;<a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&gt;</code></td>
+<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">LocalityBasedCandidateGenerator.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#tryMoveOrSwap-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-int-">tryMoveOrSwap</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
              int&nbsp;fromServer,
              int&nbsp;fromRegion,
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
index 9d233ef..0273bd9 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -205,8 +205,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html b/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html
index 3fd342a..e33b455 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html
@@ -559,14 +559,10 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></td>
-<td class="colLast"><span class="typeNameLabel">LocalityBasedCandidateGenerator.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#masterServices">masterServices</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></td>
 <td class="colLast"><span class="typeNameLabel">BaseLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#services">services</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></td>
 <td class="colLast"><span class="typeNameLabel">MasterClusterInfoProvider.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/MasterClusterInfoProvider.html#services">services</a></span></code>&nbsp;</td>
 </tr>
@@ -587,14 +583,6 @@
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredStochasticBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
-<td class="colFirst"><code>void</code></td>
-<td class="colLast"><span class="typeNameLabel">StochasticLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
-<td class="colFirst"><code>(package private) void</code></td>
-<td class="colLast"><span class="typeNameLabel">LocalityBasedCandidateGenerator.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#setServices-org.apache.hadoop.hbase.master.MasterServices-">setServices</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;services)</code>&nbsp;</td>
-</tr>
 </tbody>
 </table>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing constructors, and an explanation">
@@ -604,9 +592,6 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html#LocalityBasedCandidateGenerator-org.apache.hadoop.hbase.master.MasterServices-">LocalityBasedCandidateGenerator</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/MasterClusterInfoProvider.html#MasterClusterInfoProvider-org.apache.hadoop.hbase.master.MasterServices-">MasterClusterInfoProvider</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;services)</code>&nbsp;</td>
 </tr>
 </tbody>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index 5423820..3204742 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -338,13 +338,13 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetaRegionLocationCache.ZNodeOpType.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetaRegionLocationCache.ZNodeOpType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.ServerLiveState.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">ServerManager.ServerLiveState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetaRegionLocationCache.ZNodeOpType.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetaRegionLocationCache.ZNodeOpType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index 778c615..9c4faf0 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -222,10 +222,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index 345a20a..998b82f 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -424,19 +424,19 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClientMetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClientMetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClientMetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClientMetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index fe61c99..53c8a10 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -216,11 +216,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/package-tree.html
index 4ef4954..b0ced2c 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/package-tree.html
@@ -133,8 +133,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.store.wal.<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">ProcedureStoreTracker.DeleteState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.store.wal.<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">WALProcedureStore.PushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.store.wal.<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">ProcedureStoreTracker.DeleteState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index cc6fd38..b18a1db 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -240,12 +240,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 53c9eee..6db3dec 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -732,20 +732,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
index 0050eaa..7589ab7 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -131,8 +131,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index 0dff3a9..18cfb09 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,10 +247,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
index ee16d0e..b10b7db 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -220,8 +220,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
index 2747544..a2afef9 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
@@ -110,8 +110,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index 8a6660b..537f6ea 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -162,12 +162,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Scope.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Scope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Scope.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Scope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index acb6131..719f57f 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -190,8 +190,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 531e4b5..9ef7a37 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -211,9 +211,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ImplType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index 49d69dc..90c15a8 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -534,15 +534,15 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLockWithObjectPool.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLockWithObjectPool.ReferenceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HbckErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HbckErrorReporter.ERROR_CODE</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/DNS.ServerType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">DNS.ServerType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/DNS.ServerType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">DNS.ServerType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HbckErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HbckErrorReporter.ERROR_CODE</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLockWithObjectPool.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLockWithObjectPool.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ChoreService.ChoreServiceThreadFactory.html b/devapidocs/src-html/org/apache/hadoop/hbase/ChoreService.ChoreServiceThreadFactory.html
index 7dfa757..c6ccc03 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ChoreService.ChoreServiceThreadFactory.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ChoreService.ChoreServiceThreadFactory.html
@@ -411,33 +411,39 @@
 <span class="sourceLineNo">403</span>   * Prints a summary of important details about the chore. Used for debugging purposes<a name="line.403"></a>
 <span class="sourceLineNo">404</span>   */<a name="line.404"></a>
 <span class="sourceLineNo">405</span>  private void printChoreDetails(final String header, ScheduledChore chore) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    LinkedHashMap&lt;String, String&gt; output = new LinkedHashMap&lt;&gt;();<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    output.put(header, "");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    output.put("Chore name: ", chore.getName());<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    output.put("Chore period: ", Integer.toString(chore.getPeriod()));<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    output.put("Chore timeBetweenRuns: ", Long.toString(chore.getTimeBetweenRuns()));<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    for (Entry&lt;String, String&gt; entry : output.entrySet()) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      if (LOG.isTraceEnabled()) LOG.trace(entry.getKey() + entry.getValue());<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    }<a name="line.414"></a>
-<span class="sourceLineNo">415</span>  }<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * Prints a summary of important details about the service. Used for debugging purposes<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   */<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private void printChoreServiceDetails(final String header) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    LinkedHashMap&lt;String, String&gt; output = new LinkedHashMap&lt;&gt;();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    output.put(header, "");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    output.put("ChoreService corePoolSize: ", Integer.toString(getCorePoolSize()));<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    output.put("ChoreService scheduledChores: ", Integer.toString(getNumberOfScheduledChores()));<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    output.put("ChoreService missingStartTimeCount: ",<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      Integer.toString(getNumberOfChoresMissingStartTime()));<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>    for (Entry&lt;String, String&gt; entry : output.entrySet()) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      if (LOG.isTraceEnabled()) LOG.trace(entry.getKey() + entry.getValue());<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>}<a name="line.432"></a>
+<span class="sourceLineNo">406</span>    if (!LOG.isTraceEnabled()) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      return;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    LinkedHashMap&lt;String, String&gt; output = new LinkedHashMap&lt;&gt;();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    output.put(header, "");<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    output.put("Chore name: ", chore.getName());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    output.put("Chore period: ", Integer.toString(chore.getPeriod()));<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    output.put("Chore timeBetweenRuns: ", Long.toString(chore.getTimeBetweenRuns()));<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>    for (Entry&lt;String, String&gt; entry : output.entrySet()) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      LOG.trace(entry.getKey() + entry.getValue());<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>  /**<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * Prints a summary of important details about the service. Used for debugging purposes<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   */<a name="line.422"></a>
+<span class="sourceLineNo">423</span>  private void printChoreServiceDetails(final String header) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    if (!LOG.isTraceEnabled()) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      return;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    LinkedHashMap&lt;String, String&gt; output = new LinkedHashMap&lt;&gt;();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    output.put(header, "");<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    output.put("ChoreService corePoolSize: ", Integer.toString(getCorePoolSize()));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    output.put("ChoreService scheduledChores: ", Integer.toString(getNumberOfScheduledChores()));<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    output.put("ChoreService missingStartTimeCount: ",<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      Integer.toString(getNumberOfChoresMissingStartTime()));<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    for (Entry&lt;String, String&gt; entry : output.entrySet()) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      LOG.trace(entry.getKey() + entry.getValue());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
+<span class="sourceLineNo">438</span>}<a name="line.438"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ChoreService.html b/devapidocs/src-html/org/apache/hadoop/hbase/ChoreService.html
index 7dfa757..c6ccc03 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ChoreService.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ChoreService.html
@@ -411,33 +411,39 @@
 <span class="sourceLineNo">403</span>   * Prints a summary of important details about the chore. Used for debugging purposes<a name="line.403"></a>
 <span class="sourceLineNo">404</span>   */<a name="line.404"></a>
 <span class="sourceLineNo">405</span>  private void printChoreDetails(final String header, ScheduledChore chore) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    LinkedHashMap&lt;String, String&gt; output = new LinkedHashMap&lt;&gt;();<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    output.put(header, "");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    output.put("Chore name: ", chore.getName());<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    output.put("Chore period: ", Integer.toString(chore.getPeriod()));<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    output.put("Chore timeBetweenRuns: ", Long.toString(chore.getTimeBetweenRuns()));<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    for (Entry&lt;String, String&gt; entry : output.entrySet()) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      if (LOG.isTraceEnabled()) LOG.trace(entry.getKey() + entry.getValue());<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    }<a name="line.414"></a>
-<span class="sourceLineNo">415</span>  }<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * Prints a summary of important details about the service. Used for debugging purposes<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   */<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private void printChoreServiceDetails(final String header) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    LinkedHashMap&lt;String, String&gt; output = new LinkedHashMap&lt;&gt;();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    output.put(header, "");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    output.put("ChoreService corePoolSize: ", Integer.toString(getCorePoolSize()));<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    output.put("ChoreService scheduledChores: ", Integer.toString(getNumberOfScheduledChores()));<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    output.put("ChoreService missingStartTimeCount: ",<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      Integer.toString(getNumberOfChoresMissingStartTime()));<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>    for (Entry&lt;String, String&gt; entry : output.entrySet()) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      if (LOG.isTraceEnabled()) LOG.trace(entry.getKey() + entry.getValue());<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>}<a name="line.432"></a>
+<span class="sourceLineNo">406</span>    if (!LOG.isTraceEnabled()) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      return;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    LinkedHashMap&lt;String, String&gt; output = new LinkedHashMap&lt;&gt;();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    output.put(header, "");<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    output.put("Chore name: ", chore.getName());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    output.put("Chore period: ", Integer.toString(chore.getPeriod()));<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    output.put("Chore timeBetweenRuns: ", Long.toString(chore.getTimeBetweenRuns()));<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>    for (Entry&lt;String, String&gt; entry : output.entrySet()) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      LOG.trace(entry.getKey() + entry.getValue());<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>  /**<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * Prints a summary of important details about the service. Used for debugging purposes<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   */<a name="line.422"></a>
+<span class="sourceLineNo">423</span>  private void printChoreServiceDetails(final String header) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    if (!LOG.isTraceEnabled()) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      return;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    LinkedHashMap&lt;String, String&gt; output = new LinkedHashMap&lt;&gt;();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    output.put(header, "");<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    output.put("ChoreService corePoolSize: ", Integer.toString(getCorePoolSize()));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    output.put("ChoreService scheduledChores: ", Integer.toString(getNumberOfScheduledChores()));<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    output.put("ChoreService missingStartTimeCount: ",<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      Integer.toString(getNumberOfChoresMissingStartTime()));<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>    for (Entry&lt;String, String&gt; entry : output.entrySet()) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      LOG.trace(entry.getKey() + entry.getValue());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
+<span class="sourceLineNo">438</span>}<a name="line.438"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/NettyRpcDuplexHandler.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/NettyRpcDuplexHandler.html
index 72c80ec..be52712 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/NettyRpcDuplexHandler.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/NettyRpcDuplexHandler.html
@@ -158,9 +158,9 @@
 <span class="sourceLineNo">150</span>      // to return a response. There is nothing we can do w/ the response at this stage. Clean<a name="line.150"></a>
 <span class="sourceLineNo">151</span>      // out the wire of the response so its out of the way and we can get other responses on<a name="line.151"></a>
 <span class="sourceLineNo">152</span>      // this connection.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      int readSoFar = IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      int whatIsLeftToRead = totalSize - readSoFar;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      if (LOG.isDebugEnabled()) {<a name="line.155"></a>
+<span class="sourceLineNo">153</span>      if (LOG.isDebugEnabled()) {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        int readSoFar = IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        int whatIsLeftToRead = totalSize - readSoFar;<a name="line.155"></a>
 <span class="sourceLineNo">156</span>        LOG.debug("Unknown callId: " + id + ", skipping over this response of " + whatIsLeftToRead<a name="line.156"></a>
 <span class="sourceLineNo">157</span>            + " bytes");<a name="line.157"></a>
 <span class="sourceLineNo">158</span>      }<a name="line.158"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html
index 98451f4..0a7f54a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html
@@ -26,137 +26,119 @@
 <span class="sourceLineNo">018</span><a name="line.18"></a>
 <span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.master.balancer;<a name="line.19"></a>
 <span class="sourceLineNo">020</span><a name="line.20"></a>
-<span class="sourceLineNo">021</span>import java.util.ArrayList;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import java.util.Collections;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import java.util.List;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import java.util.Map;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.26"></a>
-<span class="sourceLineNo">027</span><a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.28"></a>
-<span class="sourceLineNo">029</span><a name="line.29"></a>
-<span class="sourceLineNo">030</span>/**<a name="line.30"></a>
-<span class="sourceLineNo">031</span> * Generates a candidate action to be applied to the cluster for cost function search<a name="line.31"></a>
-<span class="sourceLineNo">032</span> */<a name="line.32"></a>
-<span class="sourceLineNo">033</span>@InterfaceAudience.Private<a name="line.33"></a>
-<span class="sourceLineNo">034</span>abstract class CandidateGenerator {<a name="line.34"></a>
-<span class="sourceLineNo">035</span><a name="line.35"></a>
-<span class="sourceLineNo">036</span>  abstract BaseLoadBalancer.Cluster.Action generate(BaseLoadBalancer.Cluster cluster);<a name="line.36"></a>
-<span class="sourceLineNo">037</span><a name="line.37"></a>
-<span class="sourceLineNo">038</span>  /**<a name="line.38"></a>
-<span class="sourceLineNo">039</span>   * From a list of regions pick a random one. Null can be returned which<a name="line.39"></a>
-<span class="sourceLineNo">040</span>   * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.40"></a>
-<span class="sourceLineNo">041</span>   * rather than swap.<a name="line.41"></a>
-<span class="sourceLineNo">042</span>   *<a name="line.42"></a>
-<span class="sourceLineNo">043</span>   * @param cluster The state of the cluster<a name="line.43"></a>
-<span class="sourceLineNo">044</span>   * @param server index of the server<a name="line.44"></a>
-<span class="sourceLineNo">045</span>   * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.45"></a>
-<span class="sourceLineNo">046</span>   *   than a swap.<a name="line.46"></a>
-<span class="sourceLineNo">047</span>   * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.47"></a>
-<span class="sourceLineNo">048</span>   *   suggested.<a name="line.48"></a>
-<span class="sourceLineNo">049</span>   */<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  int pickRandomRegion(BaseLoadBalancer.Cluster cluster, int server,<a name="line.50"></a>
-<span class="sourceLineNo">051</span>    double chanceOfNoSwap) {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>    // Check to see if this is just a move.<a name="line.52"></a>
-<span class="sourceLineNo">053</span>    if (cluster.regionsPerServer[server].length == 0<a name="line.53"></a>
-<span class="sourceLineNo">054</span>        || StochasticLoadBalancer.RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>      // signal a move only.<a name="line.55"></a>
-<span class="sourceLineNo">056</span>      return -1;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    }<a name="line.57"></a>
-<span class="sourceLineNo">058</span>    int rand = StochasticLoadBalancer.RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    return cluster.regionsPerServer[server][rand];<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  }<a name="line.60"></a>
+<span class="sourceLineNo">021</span>import java.util.Map;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.23"></a>
+<span class="sourceLineNo">024</span><a name="line.24"></a>
+<span class="sourceLineNo">025</span>/**<a name="line.25"></a>
+<span class="sourceLineNo">026</span> * Generates a candidate action to be applied to the cluster for cost function search<a name="line.26"></a>
+<span class="sourceLineNo">027</span> */<a name="line.27"></a>
+<span class="sourceLineNo">028</span>@InterfaceAudience.Private<a name="line.28"></a>
+<span class="sourceLineNo">029</span>abstract class CandidateGenerator {<a name="line.29"></a>
+<span class="sourceLineNo">030</span><a name="line.30"></a>
+<span class="sourceLineNo">031</span>  abstract BaseLoadBalancer.Cluster.Action generate(BaseLoadBalancer.Cluster cluster);<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>  /**<a name="line.33"></a>
+<span class="sourceLineNo">034</span>   * From a list of regions pick a random one. Null can be returned which<a name="line.34"></a>
+<span class="sourceLineNo">035</span>   * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.35"></a>
+<span class="sourceLineNo">036</span>   * rather than swap.<a name="line.36"></a>
+<span class="sourceLineNo">037</span>   *<a name="line.37"></a>
+<span class="sourceLineNo">038</span>   * @param cluster The state of the cluster<a name="line.38"></a>
+<span class="sourceLineNo">039</span>   * @param server index of the server<a name="line.39"></a>
+<span class="sourceLineNo">040</span>   * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.40"></a>
+<span class="sourceLineNo">041</span>   *   than a swap.<a name="line.41"></a>
+<span class="sourceLineNo">042</span>   * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.42"></a>
+<span class="sourceLineNo">043</span>   *   suggested.<a name="line.43"></a>
+<span class="sourceLineNo">044</span>   */<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  int pickRandomRegion(BaseLoadBalancer.Cluster cluster, int server,<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    double chanceOfNoSwap) {<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    // Check to see if this is just a move.<a name="line.47"></a>
+<span class="sourceLineNo">048</span>    if (cluster.regionsPerServer[server].length == 0<a name="line.48"></a>
+<span class="sourceLineNo">049</span>        || StochasticLoadBalancer.RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.49"></a>
+<span class="sourceLineNo">050</span>      // signal a move only.<a name="line.50"></a>
+<span class="sourceLineNo">051</span>      return -1;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    }<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    int rand = StochasticLoadBalancer.RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    return cluster.regionsPerServer[server][rand];<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  }<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  int pickRandomServer(BaseLoadBalancer.Cluster cluster) {<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    if (cluster.numServers &lt; 1) {<a name="line.58"></a>
+<span class="sourceLineNo">059</span>      return -1;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    }<a name="line.60"></a>
 <span class="sourceLineNo">061</span><a name="line.61"></a>
-<span class="sourceLineNo">062</span>  int pickRandomServer(BaseLoadBalancer.Cluster cluster) {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    if (cluster.numServers &lt; 1) {<a name="line.63"></a>
-<span class="sourceLineNo">064</span>      return -1;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    }<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>    return StochasticLoadBalancer.RANDOM.nextInt(cluster.numServers);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  }<a name="line.68"></a>
+<span class="sourceLineNo">062</span>    return StochasticLoadBalancer.RANDOM.nextInt(cluster.numServers);<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  }<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  int pickRandomRack(BaseLoadBalancer.Cluster cluster) {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    if (cluster.numRacks &lt; 1) {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      return -1;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    }<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  int pickRandomRack(BaseLoadBalancer.Cluster cluster) {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    if (cluster.numRacks &lt; 1) {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>      return -1;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    }<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>    return StochasticLoadBalancer.RANDOM.nextInt(cluster.numRacks);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  }<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  int pickOtherRandomServer(BaseLoadBalancer.Cluster cluster, int serverIndex) {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    if (cluster.numServers &lt; 2) {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      return -1;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    while (true) {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      int otherServerIndex = pickRandomServer(cluster);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      if (otherServerIndex != serverIndex) {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>        return otherServerIndex;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      }<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    }<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  }<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  int pickOtherRandomRack(BaseLoadBalancer.Cluster cluster, int rackIndex) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    if (cluster.numRacks &lt; 2) {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      return -1;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    }<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    while (true) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      int otherRackIndex = pickRandomRack(cluster);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      if (otherRackIndex != rackIndex) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>        return otherRackIndex;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      }<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  BaseLoadBalancer.Cluster.Action pickRandomRegions(BaseLoadBalancer.Cluster cluster,<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    int thisServer, int otherServer) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      return BaseLoadBalancer.Cluster.NullAction;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>    // Decide who is most likely to need another region<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    // Assign the chance based upon the above<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>    int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>    return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  }<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  protected BaseLoadBalancer.Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      int toServer, int toRegion) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return BaseLoadBalancer.Cluster.NullAction;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    if (fromRegion &gt;= 0 &amp;&amp; toRegion &gt;= 0) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      return new BaseLoadBalancer.Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        toServer, toRegion);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    } else if (fromRegion &gt;= 0) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      return new BaseLoadBalancer.Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    } else if (toRegion &gt;= 0) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      return new BaseLoadBalancer.Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    } else {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      return BaseLoadBalancer.Cluster.NullAction;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  /**<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   * Returns a random iteration order of indexes of an array with size length<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   */<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    for (int i = 0; i &lt; length; i++) {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      order.add(i);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    Collections.shuffle(order);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    return order;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>}<a name="line.151"></a>
+<span class="sourceLineNo">070</span>    return StochasticLoadBalancer.RANDOM.nextInt(cluster.numRacks);<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  }<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span>  int pickOtherRandomServer(BaseLoadBalancer.Cluster cluster, int serverIndex) {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    if (cluster.numServers &lt; 2) {<a name="line.74"></a>
+<span class="sourceLineNo">075</span>      return -1;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    }<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    while (true) {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      int otherServerIndex = pickRandomServer(cluster);<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      if (otherServerIndex != serverIndex) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>        return otherServerIndex;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      }<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    }<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  }<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>  int pickOtherRandomRack(BaseLoadBalancer.Cluster cluster, int rackIndex) {<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    if (cluster.numRacks &lt; 2) {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      return -1;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    }<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    while (true) {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      int otherRackIndex = pickRandomRack(cluster);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      if (otherRackIndex != rackIndex) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>        return otherRackIndex;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      }<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    }<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>  BaseLoadBalancer.Cluster.Action pickRandomRegions(BaseLoadBalancer.Cluster cluster,<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    int thisServer, int otherServer) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      return BaseLoadBalancer.Cluster.NullAction;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>    // Decide who is most likely to need another region<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>    // Assign the chance based upon the above<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>    int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>    return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  }<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>  protected BaseLoadBalancer.Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      int toServer, int toRegion) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      return BaseLoadBalancer.Cluster.NullAction;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    if (fromRegion &gt;= 0 &amp;&amp; toRegion &gt;= 0) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      return new BaseLoadBalancer.Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        toServer, toRegion);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    } else if (fromRegion &gt;= 0) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      return new BaseLoadBalancer.Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    } else if (toRegion &gt;= 0) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      return new BaseLoadBalancer.Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    } else {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      return BaseLoadBalancer.Cluster.NullAction;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  }<a name="line.132"></a>
+<span class="sourceLineNo">133</span>}<a name="line.133"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html
index 2d988a9..0682d68 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/LocalityBasedCandidateGenerator.html
@@ -26,79 +26,67 @@
 <span class="sourceLineNo">018</span><a name="line.18"></a>
 <span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.master.balancer;<a name="line.19"></a>
 <span class="sourceLineNo">020</span><a name="line.20"></a>
-<span class="sourceLineNo">021</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.21"></a>
-<span class="sourceLineNo">022</span><a name="line.22"></a>
-<span class="sourceLineNo">023</span>import org.apache.hbase.thirdparty.com.google.common.base.Optional;<a name="line.23"></a>
+<span class="sourceLineNo">021</span>import java.util.Optional;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.util.concurrent.ThreadLocalRandom;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.23"></a>
 <span class="sourceLineNo">024</span><a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.25"></a>
-<span class="sourceLineNo">026</span><a name="line.26"></a>
-<span class="sourceLineNo">027</span>@InterfaceAudience.Private<a name="line.27"></a>
-<span class="sourceLineNo">028</span>class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.28"></a>
-<span class="sourceLineNo">029</span><a name="line.29"></a>
-<span class="sourceLineNo">030</span>  private MasterServices masterServices;<a name="line.30"></a>
-<span class="sourceLineNo">031</span><a name="line.31"></a>
-<span class="sourceLineNo">032</span>  LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.32"></a>
-<span class="sourceLineNo">033</span>    this.masterServices = masterServices;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>  }<a name="line.34"></a>
-<span class="sourceLineNo">035</span><a name="line.35"></a>
-<span class="sourceLineNo">036</span>  @Override<a name="line.36"></a>
-<span class="sourceLineNo">037</span>  BaseLoadBalancer.Cluster.Action generate(BaseLoadBalancer.Cluster cluster) {<a name="line.37"></a>
-<span class="sourceLineNo">038</span>    if (this.masterServices == null) {<a name="line.38"></a>
-<span class="sourceLineNo">039</span>      int thisServer = pickRandomServer(cluster);<a name="line.39"></a>
-<span class="sourceLineNo">040</span>      // Pick the other server<a name="line.40"></a>
-<span class="sourceLineNo">041</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.41"></a>
-<span class="sourceLineNo">042</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    }<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>    // Randomly iterate through regions until you find one that is not on ideal host<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.46"></a>
-<span class="sourceLineNo">047</span>      int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.47"></a>
-<span class="sourceLineNo">048</span>      if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(<a name="line.48"></a>
-<span class="sourceLineNo">049</span>        BaseLoadBalancer.Cluster.LocalityType.SERVER)[region]) {<a name="line.49"></a>
-<span class="sourceLineNo">050</span>        Optional&lt;BaseLoadBalancer.Cluster.Action&gt; potential = tryMoveOrSwap(cluster,<a name="line.50"></a>
-<span class="sourceLineNo">051</span>          currentServer, region,<a name="line.51"></a>
-<span class="sourceLineNo">052</span>          cluster.getOrComputeRegionsToMostLocalEntities(<a name="line.52"></a>
-<span class="sourceLineNo">053</span>            BaseLoadBalancer.Cluster.LocalityType.SERVER)[region]<a name="line.53"></a>
-<span class="sourceLineNo">054</span>        );<a name="line.54"></a>
-<span class="sourceLineNo">055</span>        if (potential.isPresent()) {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>          return potential.get();<a name="line.56"></a>
-<span class="sourceLineNo">057</span>        }<a name="line.57"></a>
-<span class="sourceLineNo">058</span>      }<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    }<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    return BaseLoadBalancer.Cluster.NullAction;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  }<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  private Optional&lt;BaseLoadBalancer.Cluster.Action&gt; tryMoveOrSwap(BaseLoadBalancer.Cluster cluster,<a name="line.63"></a>
-<span class="sourceLineNo">064</span>      int fromServer, int fromRegion, int toServer) {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    }<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    double fromRegionLocalityDelta = getWeightedLocality(cluster, fromRegion, toServer)<a name="line.70"></a>
-<span class="sourceLineNo">071</span>      - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>      int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      double toRegionLocalityDelta = getWeightedLocality(cluster, toRegion, fromServer)<a name="line.74"></a>
-<span class="sourceLineNo">075</span>        - getWeightedLocality(cluster, toRegion, toServer);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      // If locality would remain neutral or improve, attempt the swap<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      }<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    }<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    return Optional.absent();<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  }<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private double getWeightedLocality(BaseLoadBalancer.Cluster cluster, int region, int server) {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    return cluster.getOrComputeWeightedLocality(region, server,<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      BaseLoadBalancer.Cluster.LocalityType.SERVER);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  void setServices(MasterServices services) {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    this.masterServices = services;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  }<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>}<a name="line.93"></a>
+<span class="sourceLineNo">025</span>@InterfaceAudience.Private<a name="line.25"></a>
+<span class="sourceLineNo">026</span>class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.26"></a>
+<span class="sourceLineNo">027</span><a name="line.27"></a>
+<span class="sourceLineNo">028</span>  @Override<a name="line.28"></a>
+<span class="sourceLineNo">029</span>  BaseLoadBalancer.Cluster.Action generate(BaseLoadBalancer.Cluster cluster) {<a name="line.29"></a>
+<span class="sourceLineNo">030</span>    // iterate through regions until you find one that is not on ideal host<a name="line.30"></a>
+<span class="sourceLineNo">031</span>    // start from a random point to avoid always balance the regions in front<a name="line.31"></a>
+<span class="sourceLineNo">032</span>    if (cluster.numRegions &gt; 0) {<a name="line.32"></a>
+<span class="sourceLineNo">033</span>      int startIndex = ThreadLocalRandom.current().nextInt(cluster.numRegions);<a name="line.33"></a>
+<span class="sourceLineNo">034</span>      for (int i = 0; i &lt; cluster.numRegions; i++) {<a name="line.34"></a>
+<span class="sourceLineNo">035</span>        int region = (startIndex + i) % cluster.numRegions;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.36"></a>
+<span class="sourceLineNo">037</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(<a name="line.37"></a>
+<span class="sourceLineNo">038</span>          BaseLoadBalancer.Cluster.LocalityType.SERVER)[region]) {<a name="line.38"></a>
+<span class="sourceLineNo">039</span>          Optional&lt;BaseLoadBalancer.Cluster.Action&gt; potential = tryMoveOrSwap(cluster,<a name="line.39"></a>
+<span class="sourceLineNo">040</span>            currentServer, region, cluster.getOrComputeRegionsToMostLocalEntities(<a name="line.40"></a>
+<span class="sourceLineNo">041</span>              BaseLoadBalancer.Cluster.LocalityType.SERVER)[region]);<a name="line.41"></a>
+<span class="sourceLineNo">042</span>          if (potential.isPresent()) {<a name="line.42"></a>
+<span class="sourceLineNo">043</span>            return potential.get();<a name="line.43"></a>
+<span class="sourceLineNo">044</span>          }<a name="line.44"></a>
+<span class="sourceLineNo">045</span>        }<a name="line.45"></a>
+<span class="sourceLineNo">046</span>      }<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    }<a name="line.47"></a>
+<span class="sourceLineNo">048</span>    return BaseLoadBalancer.Cluster.NullAction;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>  }<a name="line.49"></a>
+<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">051</span>  private Optional&lt;BaseLoadBalancer.Cluster.Action&gt; tryMoveOrSwap(BaseLoadBalancer.Cluster cluster,<a name="line.51"></a>
+<span class="sourceLineNo">052</span>      int fromServer, int fromRegion, int toServer) {<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.54"></a>
+<span class="sourceLineNo">055</span>      return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    }<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    double fromRegionLocalityDelta = getWeightedLocality(cluster, fromRegion, toServer)<a name="line.58"></a>
+<span class="sourceLineNo">059</span>      - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    int toServertotalRegions =  cluster.regionsPerServer[toServer].length;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    if (toServertotalRegions &gt; 0) {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      int startIndex = ThreadLocalRandom.current().nextInt(toServertotalRegions);<a name="line.62"></a>
+<span class="sourceLineNo">063</span>      for (int i = 0; i &lt; toServertotalRegions; i++) {<a name="line.63"></a>
+<span class="sourceLineNo">064</span>        int toRegionIndex = (startIndex + i) % toServertotalRegions;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.65"></a>
+<span class="sourceLineNo">066</span>        double toRegionLocalityDelta = getWeightedLocality(cluster, toRegion, fromServer) -<a name="line.66"></a>
+<span class="sourceLineNo">067</span>          getWeightedLocality(cluster, toRegion, toServer);<a name="line.67"></a>
+<span class="sourceLineNo">068</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.68"></a>
+<span class="sourceLineNo">069</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.70"></a>
+<span class="sourceLineNo">071</span>        }<a name="line.71"></a>
+<span class="sourceLineNo">072</span>      }<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    }<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    return Optional.empty();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  }<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private double getWeightedLocality(BaseLoadBalancer.Cluster cluster, int region, int server) {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    return cluster.getOrComputeWeightedLocality(region, server,<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      BaseLoadBalancer.Cluster.LocalityType.SERVER);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  }<a name="line.80"></a>
+<span class="sourceLineNo">081</span>}<a name="line.81"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
index ba64241..9fc7402 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
@@ -46,1483 +46,1480 @@
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TableName;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.BalancerDecision;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;ul&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;/ul&gt;<a name="line.70"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.namequeues.BalancerDecisionDetails;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;p&gt;This is a best effort load balancer. Given a Cost function F(C) =&amp;gt; x It will<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * randomly try and mutate the cluster to Cprime. If F(Cprime) &amp;lt; F(C) then the<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * new cluster state becomes the plan. It includes costs functions to compute the cost of:&lt;/p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * &lt;ul&gt;<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;li&gt;Region Load&lt;/li&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;Table Load&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Data Locality&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Memstore Sizes&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;li&gt;Storefile Sizes&lt;/li&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;/ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
 <span class="sourceLineNo">071</span> *<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;ul&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * &lt;/ul&gt;<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;ul&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * &lt;/ul&gt;<a name="line.89"></a>
-<span class="sourceLineNo">090</span> *<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span> *<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * configuration values:&lt;/p&gt;<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * &lt;ul&gt;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.96"></a>
-<span class="sourceLineNo">097</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.97"></a>
-<span class="sourceLineNo">098</span> *   balancer.&lt;/li&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.99"></a>
-<span class="sourceLineNo">100</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.100"></a>
-<span class="sourceLineNo">101</span> *   mutate all servers.&lt;/li&gt;<a name="line.101"></a>
-<span class="sourceLineNo">102</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.102"></a>
-<span class="sourceLineNo">103</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.103"></a>
-<span class="sourceLineNo">104</span> *   value and the above computation.&lt;/li&gt;<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * &lt;/ul&gt;<a name="line.105"></a>
-<span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span> */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.112"></a>
-<span class="sourceLineNo">113</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected static final String MAX_STEPS_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected static final String KEEP_REGION_LOADS =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  // values are defaults<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private int maxSteps = 1000000;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private boolean runMaxSteps = false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private int stepsPerRegion = 800;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private int numRegionLoadsToRemember = 15;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private float minCostNeedBalance = 0.05f;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // to save and report costs to JMX<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private Double curOverallCost = 0d;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private Double[] tempFunctionCosts;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private Double[] curFunctionCosts;<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  // Keep locality based picker and cost function to alert them<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // when new services are offered<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private ServerLocalityCostFunction localityCost;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * Use to add balancer decision history to ring-buffer<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * default MetricsBalancer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public StochasticLoadBalancer() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    super(new MetricsStochasticBalancer());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public void onConfigurationChange(Configuration conf) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    setConf(conf);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  @Override<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public synchronized void setConf(Configuration conf) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    super.setConf(conf);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (localityCandidateGenerator == null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator(services);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (this.candidateGenerators == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      candidateGenerators = Lists.newArrayList();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      new ReadRequestCostFunction(conf),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      new CPRequestCostFunction(conf),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      new WriteRequestCostFunction(conf),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      new MemStoreSizeCostFunction(conf),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      new StoreFileCostFunction(conf)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addCostFunction(localityCost);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    addCostFunction(rackLocalityCost);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    loadCustomCostFunctions(conf);<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (null == functionsNames) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      } catch (ClassNotFoundException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (null == klass) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      LOG.info(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return reflected;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Exposed for Testing!<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.candidateGenerators;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  protected void setSlop(Configuration conf) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    super.setClusterMetrics(st);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    updateRegionLoad();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      cost.setClusterMetrics(st);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>    // update metrics size<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    try {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // by-table or ensemble mode<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int functionsCount = getCostFunctionNames().length;<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    } catch (Exception e) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      LOG.error("failed to get the size of all tables", e);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * Update the number of metrics that are reported to JMX<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public void updateMetricsSize(int size) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  @Override<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public synchronized void setMasterServices(MasterServices masterServices) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    super.setMasterServices(masterServices);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    this.localityCandidateGenerator.setServices(masterServices);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    regionReplicaHostCostFunction.init(c);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) return true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    regionReplicaRackCostFunction.init(c);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return false;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (LOG.isDebugEnabled()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            + " active regionserver(s)");<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      return false;<a name="line.335"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;Every cost function returns a number between 0 and 1 inclusive; where 0 is the lowest cost<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * best solution, and 1 is the highest possible cost and the worst solution.  The computed costs are<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * scaled by their respective multipliers:&lt;/p&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> *<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;ul&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *   &lt;li&gt;hbase.master.balancer.stochastic.regionLoadCost&lt;/li&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> *   &lt;li&gt;hbase.master.balancer.stochastic.moveCost&lt;/li&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> *   &lt;li&gt;hbase.master.balancer.stochastic.tableLoadCost&lt;/li&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> *   &lt;li&gt;hbase.master.balancer.stochastic.localityCost&lt;/li&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> *   &lt;li&gt;hbase.master.balancer.stochastic.memstoreSizeCost&lt;/li&gt;<a name="line.81"></a>
+<span class="sourceLineNo">082</span> *   &lt;li&gt;hbase.master.balancer.stochastic.storefileSizeCost&lt;/li&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * &lt;/ul&gt;<a name="line.83"></a>
+<span class="sourceLineNo">084</span> *<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * &lt;p&gt;You can also add custom Cost function by setting the the following configuration value:&lt;/p&gt;<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;ul&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> *     &lt;li&gt;hbase.master.balancer.stochastic.additionalCostFunctions&lt;/li&gt;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;/ul&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> *<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * &lt;p&gt;All custom Cost Functions needs to extends {@link StochasticLoadBalancer.CostFunction}&lt;/p&gt;<a name="line.90"></a>
+<span class="sourceLineNo">091</span> *<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * &lt;p&gt;In addition to the above configurations, the balancer can be tuned by the following<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * configuration values:&lt;/p&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;ul&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxMoveRegions which<a name="line.95"></a>
+<span class="sourceLineNo">096</span> *   controls what the max number of regions that can be moved in a single invocation of this<a name="line.96"></a>
+<span class="sourceLineNo">097</span> *   balancer.&lt;/li&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> *   &lt;li&gt;hbase.master.balancer.stochastic.stepsPerRegion is the coefficient by which the number of<a name="line.98"></a>
+<span class="sourceLineNo">099</span> *   regions is multiplied to try and get the number of times the balancer will<a name="line.99"></a>
+<span class="sourceLineNo">100</span> *   mutate all servers.&lt;/li&gt;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> *   &lt;li&gt;hbase.master.balancer.stochastic.maxSteps which controls the maximum number of times that<a name="line.101"></a>
+<span class="sourceLineNo">102</span> *   the balancer will try and mutate all the servers. The balancer will use the minimum of this<a name="line.102"></a>
+<span class="sourceLineNo">103</span> *   value and the above computation.&lt;/li&gt;<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * &lt;/ul&gt;<a name="line.104"></a>
+<span class="sourceLineNo">105</span> *<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * &lt;p&gt;This balancer is best used with hbase.master.loadbalance.bytable set to false<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * so that the balancer gets the full picture of all loads on the cluster.&lt;/p&gt;<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  justification="Complaint is about costFunctions not being synchronized; not end of the world")<a name="line.111"></a>
+<span class="sourceLineNo">112</span>public class StochasticLoadBalancer extends BaseLoadBalancer {<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected static final String STEPS_PER_REGION_KEY =<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      "hbase.master.balancer.stochastic.stepsPerRegion";<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected static final String MAX_STEPS_KEY =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      "hbase.master.balancer.stochastic.maxSteps";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected static final String RUN_MAX_STEPS_KEY =<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      "hbase.master.balancer.stochastic.runMaxSteps";<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  protected static final String MAX_RUNNING_TIME_KEY =<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      "hbase.master.balancer.stochastic.maxRunningTime";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  protected static final String KEEP_REGION_LOADS =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "hbase.master.balancer.stochastic.numRegionLoadsToRemember";<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private static final String TABLE_FUNCTION_SEP = "_";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  protected static final String MIN_COST_NEED_BALANCE_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      "hbase.master.balancer.stochastic.minCostNeedBalance";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  protected static final String COST_FUNCTIONS_COST_FUNCTIONS_KEY =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          "hbase.master.balancer.stochastic.additionalCostFunctions";<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final Logger LOG = LoggerFactory.getLogger(StochasticLoadBalancer.class);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = new HashMap&lt;&gt;();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // values are defaults<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private int maxSteps = 1000000;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private boolean runMaxSteps = false;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private int stepsPerRegion = 800;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private long maxRunningTime = 30 * 1000 * 1; // 30 seconds.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private int numRegionLoadsToRemember = 15;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private float minCostNeedBalance = 0.05f;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private List&lt;CandidateGenerator&gt; candidateGenerators;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private CostFromRegionLoadFunction[] regionLoadFunctions;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private List&lt;CostFunction&gt; costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  // to save and report costs to JMX<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private Double curOverallCost = 0d;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private Double[] tempFunctionCosts;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private Double[] curFunctionCosts;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // Keep locality based picker and cost function to alert them<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  // when new services are offered<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private LocalityBasedCandidateGenerator localityCandidateGenerator;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private ServerLocalityCostFunction localityCost;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private RackLocalityCostFunction rackLocalityCost;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private RegionReplicaHostCostFunction regionReplicaHostCostFunction;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private RegionReplicaRackCostFunction regionReplicaRackCostFunction;<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * Use to add balancer decision history to ring-buffer<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  NamedQueueRecorder namedQueueRecorder;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The constructor that pass a MetricsStochasticBalancer to BaseLoadBalancer to replace its<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * default MetricsBalancer<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public StochasticLoadBalancer() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    super(new MetricsStochasticBalancer());<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public void onConfigurationChange(Configuration conf) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    setConf(conf);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public synchronized void setConf(Configuration conf) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    super.setConf(conf);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    maxSteps = conf.getInt(MAX_STEPS_KEY, maxSteps);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    stepsPerRegion = conf.getInt(STEPS_PER_REGION_KEY, stepsPerRegion);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    maxRunningTime = conf.getLong(MAX_RUNNING_TIME_KEY, maxRunningTime);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    runMaxSteps = conf.getBoolean(RUN_MAX_STEPS_KEY, runMaxSteps);<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    numRegionLoadsToRemember = conf.getInt(KEEP_REGION_LOADS, numRegionLoadsToRemember);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    minCostNeedBalance = conf.getFloat(MIN_COST_NEED_BALANCE_KEY, minCostNeedBalance);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (localityCandidateGenerator == null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      localityCandidateGenerator = new LocalityBasedCandidateGenerator();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    localityCost = new ServerLocalityCostFunction(conf);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    rackLocalityCost = new RackLocalityCostFunction(conf);<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>    if (this.candidateGenerators == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      candidateGenerators = Lists.newArrayList();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      candidateGenerators.add(new RandomCandidateGenerator());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      candidateGenerators.add(new LoadCandidateGenerator());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      candidateGenerators.add(localityCandidateGenerator);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      candidateGenerators.add(new RegionReplicaRackCandidateGenerator());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    regionLoadFunctions = new CostFromRegionLoadFunction[] {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      new ReadRequestCostFunction(conf),<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      new CPRequestCostFunction(conf),<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      new WriteRequestCostFunction(conf),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      new MemStoreSizeCostFunction(conf),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      new StoreFileCostFunction(conf)<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    };<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    regionReplicaHostCostFunction = new RegionReplicaHostCostFunction(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    regionReplicaRackCostFunction = new RegionReplicaRackCostFunction(conf);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    costFunctions = new ArrayList&lt;&gt;();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addCostFunction(new RegionCountSkewCostFunction(conf));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    addCostFunction(new PrimaryRegionCountSkewCostFunction(conf));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    addCostFunction(new MoveCostFunction(conf));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    addCostFunction(localityCost);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    addCostFunction(rackLocalityCost);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    addCostFunction(new TableSkewCostFunction(conf));<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addCostFunction(regionReplicaHostCostFunction);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    addCostFunction(regionReplicaRackCostFunction);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    addCostFunction(regionLoadFunctions[0]);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    addCostFunction(regionLoadFunctions[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addCostFunction(regionLoadFunctions[2]);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    addCostFunction(regionLoadFunctions[3]);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    addCostFunction(regionLoadFunctions[4]);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    loadCustomCostFunctions(conf);<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    curFunctionCosts= new Double[costFunctions.size()];<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    tempFunctionCosts= new Double[costFunctions.size()];<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    boolean isBalancerDecisionRecording = getConf()<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (this.namedQueueRecorder == null &amp;&amp; isBalancerDecisionRecording) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.namedQueueRecorder = NamedQueueRecorder.getInstance(getConf());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    LOG.info("Loaded config; maxSteps=" + maxSteps + ", stepsPerRegion=" + stepsPerRegion +<a name="line.237"></a>
+<span class="sourceLineNo">238</span>            ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" +<a name="line.238"></a>
+<span class="sourceLineNo">239</span>            Arrays.toString(getCostFunctionNames()) + " etc.");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private void loadCustomCostFunctions(Configuration conf) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String[] functionsNames = conf.getStrings(COST_FUNCTIONS_COST_FUNCTIONS_KEY);<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (null == functionsNames) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      return;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    costFunctions.addAll(Arrays.stream(functionsNames).map(c -&gt; {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;? extends CostFunction&gt; klass = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        klass = (Class&lt;? extends CostFunction&gt;) Class.forName(c);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (ClassNotFoundException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        LOG.warn("Cannot load class " + c + "': " + e.getMessage());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (null == klass) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      CostFunction reflected = ReflectionUtils.newInstance(klass, conf);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      LOG.info(<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        "Successfully loaded custom CostFunction '" + reflected.getClass().getSimpleName() + "'");<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      return reflected;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }).filter(Objects::nonNull).collect(Collectors.toList()));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected void setCandidateGenerators(List&lt;CandidateGenerator&gt; customCandidateGenerators) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    this.candidateGenerators = customCandidateGenerators;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Exposed for Testing!<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public List&lt;CandidateGenerator&gt; getCandidateGenerators() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return this.candidateGenerators;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void setSlop(Configuration conf) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    this.slop = conf.getFloat("hbase.regions.slop", 0.001F);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public synchronized void setClusterMetrics(ClusterMetrics st) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.setClusterMetrics(st);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    updateRegionLoad();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      cost.setClusterMetrics(st);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // update metrics size<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // by-table or ensemble mode<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      int tablesCount = isByTable ? services.getTableDescriptors().getAll().size() : 1;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      int functionsCount = getCostFunctionNames().length;<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>      updateMetricsSize(tablesCount * (functionsCount + 1)); // +1 for overall<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    } catch (Exception e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      LOG.error("failed to get the size of all tables", e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * Update the number of metrics that are reported to JMX<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void updateMetricsSize(int size) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        ((MetricsStochasticBalancer) metricsBalancer).updateMetricsSize(size);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  @Override<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected synchronized boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    regionReplicaHostCostFunction.init(c);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (regionReplicaHostCostFunction.cost() &gt; 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return true;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    regionReplicaRackCostFunction.init(c);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    if (regionReplicaRackCostFunction.cost() &gt; 0) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      return true;<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  protected boolean needsBalance(TableName tableName, Cluster cluster) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      if (LOG.isDebugEnabled()) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            + " active regionserver(s)");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return false;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      return true;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (areSomeRegionReplicasColocated(cluster)) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      return true;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (idleRegionServerExist(cluster)){<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return true;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    double total = 0.0;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    float sumMultiplier = 0.0f;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (CostFunction c : costFunctions) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      float multiplier = c.getMultiplier();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (multiplier &lt;= 0) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        continue;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      if (!c.isNeeded()) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      sumMultiplier += multiplier;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      total += c.cost() * multiplier;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (LOG.isDebugEnabled()) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (LOG.isTraceEnabled()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return !balanced;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            .generate(cluster);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * should always approach the optimal state given enough steps.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      return plans;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      loadOfOneTable.remove(masterServerName);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // instantiating the storefile infos can be quite expensive.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    // be used in any computations.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      finder = this.regionFinder;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    //The clusterState that is given to this method contains the state<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    //of all the regions in the table(s) (that's true today)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Keep track of servers to iterate through them.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    initCosts(cluster);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (!needsBalance(tableName, cluster)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    curOverallCost = currentCost;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    double initCost = currentCost;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    double newCost;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    long computedMaxSteps;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (runMaxSteps) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } else {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (long)cluster.numServers;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            maxSteps);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    long step;<a name="line.450"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (idleRegionServerExist(cluster)){<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return true;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    double total = 0.0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    float sumMultiplier = 0.0f;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    for (CostFunction c : costFunctions) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      float multiplier = c.getMultiplier();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (multiplier &lt;= 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        LOG.trace("{} not needed because multiplier is &lt;= 0", c.getClass().getSimpleName());<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        continue;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (!c.isNeeded()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.trace("{} not needed", c.getClass().getSimpleName());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        continue;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      sumMultiplier += multiplier;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      total += c.cost() * multiplier;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    boolean balanced = total &lt;= 0 || sumMultiplier &lt;= 0 ||<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        (sumMultiplier &gt; 0 &amp;&amp; (total / sumMultiplier) &lt; minCostNeedBalance);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    if (LOG.isDebugEnabled()) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      LOG.debug("{} {}; total cost={}, sum multiplier={}; cost/multiplier to need a balance is {}",<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          balanced ? "Skipping load balancing because balanced" : "We need to load balance",<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          isByTable ? String.format("table (%s)", tableName) : "cluster",<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          total, sumMultiplier, minCostNeedBalance);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if (LOG.isTraceEnabled()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        LOG.trace("Balance decision detailed function costs={}", functionCost());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return !balanced;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>  Cluster.Action nextAction(Cluster cluster) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return candidateGenerators.get(RANDOM.nextInt(candidateGenerators.size()))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            .generate(cluster);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Given the cluster state this will try and approach an optimal balance. This<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * should always approach the optimal state given enough steps.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  @Override<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public synchronized List&lt;RegionPlan&gt; balanceTable(TableName tableName, Map&lt;ServerName,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;RegionInfo&gt;&gt; loadOfOneTable) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    List&lt;RegionPlan&gt; plans = balanceMasterRegions(loadOfOneTable);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (plans != null || loadOfOneTable == null || loadOfOneTable.size() &lt;= 1) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return plans;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (masterServerName != null &amp;&amp; loadOfOneTable.containsKey(masterServerName)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      if (loadOfOneTable.size() &lt;= 2) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        return null;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      loadOfOneTable = new HashMap&lt;&gt;(loadOfOneTable);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      loadOfOneTable.remove(masterServerName);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // On clusters with lots of HFileLinks or lots of reference files,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // instantiating the storefile infos can be quite expensive.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // Allow turning this feature off if the locality cost is not going to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // be used in any computations.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    RegionHDFSBlockLocationFinder finder = null;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if ((this.localityCost != null &amp;&amp; this.localityCost.getMultiplier() &gt; 0)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || (this.rackLocalityCost != null &amp;&amp; this.rackLocalityCost.getMultiplier() &gt; 0)) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      finder = this.regionFinder;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    //The clusterState that is given to this method contains the state<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    //of all the regions in the table(s) (that's true today)<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    // Keep track of servers to iterate through them.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    Cluster cluster = new Cluster(loadOfOneTable, loads, finder, rackManager);<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    long startTime = EnvironmentEdgeManager.currentTime();<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    initCosts(cluster);<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (!needsBalance(tableName, cluster)) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      return null;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    double currentCost = computeCost(cluster, Double.MAX_VALUE);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    curOverallCost = currentCost;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    double initCost = currentCost;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    double newCost;<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>    long computedMaxSteps;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (runMaxSteps) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      computedMaxSteps = Math.max(this.maxSteps,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          ((long)cluster.numRegions * (long)this.stepsPerRegion * (long)cluster.numServers));<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      long calculatedMaxSteps = (long)cluster.numRegions * (long)this.stepsPerRegion *<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          (long)cluster.numServers;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      computedMaxSteps = Math.min(this.maxSteps, calculatedMaxSteps);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      if (calculatedMaxSteps &gt; maxSteps) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        LOG.warn("calculatedMaxSteps:{} for loadbalancer's stochastic walk is larger than "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            + "maxSteps:{}. Hence load balancing may not work well. Setting parameter "<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            + "\"hbase.master.balancer.stochastic.runMaxSteps\" to true can overcome this issue."<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            + "(This config change does not require service restart)", calculatedMaxSteps,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            maxSteps);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost="<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        + functionCost() + " computedMaxSteps: " + computedMaxSteps);<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final String initFunctionTotalCosts = totalCostsPerFunc();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Perform a stochastic walk to see if we can get a good fit.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    long step;<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Cluster.Action action = nextAction(cluster);<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    for (step = 0; step &lt; computedMaxSteps; step++) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Cluster.Action action = nextAction(cluster);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>      if (action.type == Type.NULL) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        continue;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">452</span>      if (action.type == Type.NULL) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        continue;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>      cluster.doAction(action);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      updateCostsWithAction(cluster, action);<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      cluster.doAction(action);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      updateCostsWithAction(cluster, action);<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      newCost = computeCost(cluster, currentCost);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Should this be kept?<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (newCost &lt; currentCost) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        currentCost = newCost;<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>        // save for JMX<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        curOverallCost = currentCost;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } else {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // Put things back the way they were before.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // TODO: undo by remembering old values<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        Action undoAction = action.undoAction();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        cluster.doAction(undoAction);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        updateCostsWithAction(cluster, undoAction);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          maxRunningTime) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // update costs metrics<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (initCost &gt; currentCost) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      plans = createRegionPlans(cluster);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "{} regions; Going from a computed cost of {}" +<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        step, plans.size(), initCost, currentCost);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return plans;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    if (this.namedQueueRecorder != null) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      for (RegionPlan plan : plans) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        regionPlans.add(<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      BalancerDecision balancerDecision =<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        new BalancerDecision.Builder()<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          .setInitTotalCost(initCost)<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          .setComputedTotalCost(currentCost)<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          .setComputedSteps(step)<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          .setRegionPlans(regionPlans).build();<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * update costs to JMX<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (tableName == null) return;<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      // overall cost<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        "Overall", "Overall cost", overall);<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // each cost function<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        // TODO: cost function may need a specific description<a name="line.545"></a>
-<span class="sourceLineNo">546</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "The percent of " + costFunctionName, costPercent);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      costFunctions.add(costFunction);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  private String functionCost() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    StringBuilder builder = new StringBuilder();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    for (CostFunction c:costFunctions) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.append(c.getClass().getSimpleName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      builder.append(" : (");<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      builder.append(c.getMultiplier());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.append(", ");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      builder.append(c.cost());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      builder.append("); ");<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    return builder.toString();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>  }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private String totalCostsPerFunc() {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    StringBuilder builder = new StringBuilder();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    for (CostFunction c : costFunctions) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        builder.append(" ");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        builder.append(c.getClass().getSimpleName());<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        builder.append(" : ");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.append(";");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">459</span>      newCost = computeCost(cluster, currentCost);<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Should this be kept?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (newCost &lt; currentCost) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        currentCost = newCost;<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        // save for JMX<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        curOverallCost = currentCost;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        System.arraycopy(tempFunctionCosts, 0, curFunctionCosts, 0, curFunctionCosts.length);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // Put things back the way they were before.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        // TODO: undo by remembering old values<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        Action undoAction = action.undoAction();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        cluster.doAction(undoAction);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        updateCostsWithAction(cluster, undoAction);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (EnvironmentEdgeManager.currentTime() - startTime &gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          maxRunningTime) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        break;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    long endTime = EnvironmentEdgeManager.currentTime();<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    metricsBalancer.balanceCluster(endTime - startTime);<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // update costs metrics<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    if (initCost &gt; currentCost) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      plans = createRegionPlans(cluster);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      LOG.info("Finished computing new load balance plan. Computation took {}" +<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        " to try {} different iterations.  Found a solution that moves " +<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        "{} regions; Going from a computed cost of {}" +<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        " to a new cost of {}", java.time.Duration.ofMillis(endTime - startTime),<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        step, plans.size(), initCost, currentCost);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      sendRegionPlansToRingBuffer(plans, currentCost, initCost, initFunctionTotalCosts, step);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return plans;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    LOG.info("Could not find a better load balance plan.  Tried {} different configurations in " +<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      "{}, and did not find anything with a computed cost less than {}", step,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      java.time.Duration.ofMillis(endTime - startTime), initCost);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  private void sendRegionPlansToRingBuffer(List&lt;RegionPlan&gt; plans, double currentCost,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      double initCost, String initFunctionTotalCosts, long step) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    if (this.namedQueueRecorder != null) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      List&lt;String&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (RegionPlan plan : plans) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        regionPlans.add(<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          "table: " + plan.getRegionInfo().getTable() + " , region: " + plan.getRegionName()<a name="line.509"></a>
+<span class="sourceLineNo">510</span>            + " , source: " + plan.getSource() + " , destination: " + plan.getDestination());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      BalancerDecision balancerDecision =<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        new BalancerDecision.Builder()<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          .setInitTotalCost(initCost)<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .setInitialFunctionCosts(initFunctionTotalCosts)<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          .setComputedTotalCost(currentCost)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          .setFinalFunctionCosts(totalCostsPerFunc())<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          .setComputedSteps(step)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          .setRegionPlans(regionPlans).build();<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      namedQueueRecorder.addRecord(new BalancerDecisionDetails(balancerDecision));<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * update costs to JMX<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  private void updateStochasticCosts(TableName tableName, Double overall, Double[] subCosts) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    if (tableName == null) return;<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    // check if the metricsBalancer is MetricsStochasticBalancer before casting<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (metricsBalancer instanceof MetricsStochasticBalancer) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      MetricsStochasticBalancer balancer = (MetricsStochasticBalancer) metricsBalancer;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      // overall cost<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      balancer.updateStochasticCost(tableName.getNameAsString(),<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        "Overall", "Overall cost", overall);<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>      // each cost function<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        CostFunction costFunction = costFunctions.get(i);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        String costFunctionName = costFunction.getClass().getSimpleName();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Double costPercent = (overall == 0) ? 0 : (subCosts[i] / overall);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // TODO: cost function may need a specific description<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        balancer.updateStochasticCost(tableName.getNameAsString(), costFunctionName,<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          "The percent of " + costFunctionName, costPercent);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>  private void addCostFunction(CostFunction costFunction) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    if (costFunction.getMultiplier() &gt; 0) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      costFunctions.add(costFunction);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>  private String functionCost() {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    StringBuilder builder = new StringBuilder();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    for (CostFunction c:costFunctions) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      builder.append(c.getClass().getSimpleName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      builder.append(" : (");<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      builder.append(c.getMultiplier());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      builder.append(", ");<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      builder.append(c.cost());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      builder.append("); ");<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    return builder.toString();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  private String totalCostsPerFunc() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    StringBuilder builder = new StringBuilder();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    for (CostFunction c : costFunctions) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      if (c.getMultiplier() * c.cost() &gt; 0.0) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        builder.append(" ");<a name="line.572"></a>
+<span class="sourceLineNo">573</span>        builder.append(c.getClass().getSimpleName());<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        builder.append(" : ");<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        builder.append(c.getMultiplier() * c.cost());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        builder.append(";");<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      }<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    if (builder.length() &gt; 0) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.580"></a>
 <span class="sourceLineNo">581</span>    }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    if (builder.length() &gt; 0) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      builder.deleteCharAt(builder.length() - 1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return builder.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * state.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param cluster The state of the cluster<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    for (int regionIndex = 0;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (initialServerIndex != newServerIndex) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>        if (LOG.isTraceEnabled()) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.608"></a>
-<span class="sourceLineNo">609</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        plans.add(rp);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      }<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return plans;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Store the current region loads.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  private synchronized void updateRegionLoad() {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    loads = new HashMap&lt;&gt;();<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (rLoads == null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          rLoads.remove();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        loads.put(regionNameAsString, rLoads);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      });<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    });<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      cost.setLoads(loads);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  protected void initCosts(Cluster cluster) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    for (CostFunction c:costFunctions) {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      c.init(cluster);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (CostFunction c : costFunctions) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      c.postAction(action);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * Get the names of the cost functions<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>  public String[] getCostFunctionNames() {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (costFunctions == null) return null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String[] ret = new String[costFunctions.size()];<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      CostFunction c = costFunctions.get(i);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      ret[i] = c.getClass().getSimpleName();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">582</span>    return builder.toString();<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>  /**<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * Create all of the RegionPlan's needed to move from the initial cluster state to the desired<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * state.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @param cluster The state of the cluster<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @return List of RegionPlan's that represent the moves needed to get to desired final state.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  private List&lt;RegionPlan&gt; createRegionPlans(Cluster cluster) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    List&lt;RegionPlan&gt; plans = new LinkedList&lt;&gt;();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    for (int regionIndex = 0;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>         regionIndex &lt; cluster.regionIndexToServerIndex.length; regionIndex++) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      int initialServerIndex = cluster.initialRegionIndexToServerIndex[regionIndex];<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      int newServerIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      if (initialServerIndex != newServerIndex) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        RegionInfo region = cluster.regions[regionIndex];<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        ServerName initialServer = cluster.servers[initialServerIndex];<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        ServerName newServer = cluster.servers[newServerIndex];<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (LOG.isTraceEnabled()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          LOG.trace("Moving Region " + region.getEncodedName() + " from server "<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              + initialServer.getHostname() + " to " + newServer.getHostname());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        RegionPlan rp = new RegionPlan(region, initialServer, newServer);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        plans.add(rp);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    return plans;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>  /**<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * Store the current region loads.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  private synchronized void updateRegionLoad() {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // We create a new hashmap so that regions that are no longer there are removed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // However we temporarily need the old loads so we can use them to keep the rolling average.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; oldLoads = loads;<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    loads = new HashMap&lt;&gt;();<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    clusterStatus.getLiveServerMetrics().forEach((ServerName sn, ServerMetrics sm) -&gt; {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        String regionNameAsString = RegionInfo.getRegionNameAsString(regionName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(regionNameAsString);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        if (rLoads == null) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>          rLoads = new ArrayDeque&lt;&gt;(numRegionLoadsToRemember + 1);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          rLoads.remove();<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        loads.put(regionNameAsString, rLoads);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    });<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      cost.setLoads(loads);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  protected void initCosts(Cluster cluster) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    for (CostFunction c:costFunctions) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      c.init(cluster);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    for (CostFunction c : costFunctions) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      c.postAction(action);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
+<span class="sourceLineNo">656</span>   * Get the names of the cost functions<a name="line.656"></a>
+<span class="sourceLineNo">657</span>   */<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  public String[] getCostFunctionNames() {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (costFunctions == null) return null;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    String[] ret = new String[costFunctions.size()];<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      CostFunction c = costFunctions.get(i);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      ret[i] = c.getClass().getSimpleName();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    return ret;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>  }<a name="line.667"></a>
 <span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    return ret;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>  /**<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param cluster The state of the cluster<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   *         aggregate of all individual cost functions.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    double total = 0;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      CostFunction c = costFunctions.get(i);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        continue;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      }<a name="line.690"></a>
+<span class="sourceLineNo">669</span>  /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * @param cluster The state of the cluster<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   *         aggregate of all individual cost functions.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   */<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    double total = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>    for (int i = 0; i &lt; costFunctions.size(); i++) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      CostFunction c = costFunctions.get(i);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        continue;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>      Float multiplier = c.getMultiplier();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      Double cost = c.cost();<a name="line.690"></a>
 <span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>      Float multiplier = c.getMultiplier();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      Double cost = c.cost();<a name="line.693"></a>
+<span class="sourceLineNo">692</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      total += this.tempFunctionCosts[i];<a name="line.693"></a>
 <span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      total += this.tempFunctionCosts[i];<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>      if (total &gt; previousCost) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        break;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    }<a name="line.701"></a>
+<span class="sourceLineNo">695</span>      if (total &gt; previousCost) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        break;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>    return total;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
 <span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return total;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.706"></a>
+<span class="sourceLineNo">703</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    @Override<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Cluster.Action generate(Cluster cluster) {<a name="line.706"></a>
 <span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    @Override<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Cluster.Action generate(Cluster cluster) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>      int thisServer = pickRandomServer(cluster);<a name="line.711"></a>
+<span class="sourceLineNo">708</span>      int thisServer = pickRandomServer(cluster);<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>      // Pick the other server<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.711"></a>
 <span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      // Pick the other server<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  /**<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * co-hosted region replicas in the same rack<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    Cluster.Action generate(Cluster cluster) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      int rackIndex = pickRandomRack(cluster);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        return super.generate(cluster);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        cluster.regionsPerRack[rackIndex],<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        cluster.regionIndexToPrimaryIndex);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (regionIndex == -1) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // default to randompicker<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        return randomGenerator.generate(cluster);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">713</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>  /**<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * co-hosted region replicas in the same rack<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Cluster.Action generate(Cluster cluster) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      int rackIndex = pickRandomRack(cluster);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return super.generate(cluster);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.729"></a>
+<span class="sourceLineNo">730</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        cluster.regionsPerRack[rackIndex],<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        cluster.regionIndexToPrimaryIndex);<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (regionIndex == -1) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        // default to randompicker<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        return randomGenerator.generate(cluster);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.741"></a>
 <span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span><a name="line.752"></a>
-<span class="sourceLineNo">753</span>  /**<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public abstract static class CostFunction {<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    private float multiplier = 0;<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>    protected Cluster cluster;<a name="line.760"></a>
+<span class="sourceLineNo">743</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  public abstract static class CostFunction {<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    private float multiplier = 0;<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    protected Cluster cluster;<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>    public CostFunction(Configuration c) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
 <span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    public CostFunction(Configuration c) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    boolean isNeeded() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return true;<a name="line.766"></a>
+<span class="sourceLineNo">762</span>    boolean isNeeded() {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return true;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    float getMultiplier() {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return multiplier;<a name="line.766"></a>
 <span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    float getMultiplier() {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      return multiplier;<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    void setMultiplier(float m) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      this.multiplier = m;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    /** Called once per LB invocation to give the cost function<a name="line.776"></a>
-<span class="sourceLineNo">777</span>     * to initialize it's state, and perform any costly calculation.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>     */<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    void init(Cluster cluster) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      this.cluster = cluster;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    /** Called once per cluster Action to give the cost function<a name="line.783"></a>
-<span class="sourceLineNo">784</span>     * an opportunity to update it's state. postAction() is always<a name="line.784"></a>
-<span class="sourceLineNo">785</span>     * called at least once before cost() is called with the cluster<a name="line.785"></a>
-<span class="sourceLineNo">786</span>     * that this action is performed on. */<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    void postAction(Action action) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      switch (action.type) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      case NULL: break;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      case ASSIGN_REGION:<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        regionMoved(ar.region, -1, ar.server);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        break;<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      case MOVE_REGION:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        break;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      case SWAP_REGIONS:<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        break;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      default:<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>    void setMultiplier(float m) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      this.multiplier = m;<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    /** Called once per LB invocation to give the cost function<a name="line.773"></a>
+<span class="sourceLineNo">774</span>     * to initialize it's state, and perform any costly calculation.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>     */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    void init(Cluster cluster) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      this.cluster = cluster;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>    /** Called once per cluster Action to give the cost function<a name="line.780"></a>
+<span class="sourceLineNo">781</span>     * an opportunity to update it's state. postAction() is always<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * called at least once before cost() is called with the cluster<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * that this action is performed on. */<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    void postAction(Action action) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      switch (action.type) {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      case NULL: break;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      case ASSIGN_REGION:<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        regionMoved(ar.region, -1, ar.server);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        break;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      case MOVE_REGION:<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        break;<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      case SWAP_REGIONS:<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        break;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      default:<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.805"></a>
 <span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    protected abstract double cost();<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Function to compute a scaled cost using<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.817"></a>
-<span class="sourceLineNo">818</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>     *<a name="line.819"></a>
-<span class="sourceLineNo">820</span>     * @param stats the costs<a name="line.820"></a>
-<span class="sourceLineNo">821</span>     * @return a scaled set of costs.<a name="line.821"></a>
-<span class="sourceLineNo">822</span>     */<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    protected double costFromArray(double[] stats) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      double totalCost = 0;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      double total = getSum(stats);<a name="line.825"></a>
+<span class="sourceLineNo">808</span>    protected abstract double cost();<a name="line.808"></a>
+<span class="sourceLineNo">809</span><a name="line.809"></a>
+<span class="sourceLineNo">810</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>     * Function to compute a scaled cost using<a name="line.812"></a>
+<span class="sourceLineNo">813</span>     * {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#DescriptiveStatistics()}.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.814"></a>
+<span class="sourceLineNo">815</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>     *<a name="line.816"></a>
+<span class="sourceLineNo">817</span>     * @param stats the costs<a name="line.817"></a>
+<span class="sourceLineNo">818</span>     * @return a scaled set of costs.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>     */<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    protected double costFromArray(double[] stats) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      double totalCost = 0;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      double total = getSum(stats);<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      double count = stats.length;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      double mean = total/count;<a name="line.825"></a>
 <span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      double count = stats.length;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double mean = total/count;<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // a zero sum cost for this to make sense.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // It's possible that there aren't enough regions to go around<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      double min;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      if (count &gt; total) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      } else {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // Some will have 1 more than everything else.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        int numLow = (int) (count - numHigh);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.843"></a>
-<span class="sourceLineNo">844</span><a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      min = Math.max(0, min);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>        double n = stats[i];<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        double diff = Math.abs(mean - n);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        totalCost += diff;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>      double scaled =  scale(min, max, totalCost);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      return scaled;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private double getSum(double[] stats) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      double total = 0;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      for(double s:stats) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        total += s;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      return total;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * Scale the value between 0 and 1.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     *<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     * @param min   Min value<a name="line.868"></a>
-<span class="sourceLineNo">869</span>     * @param max   The Max value<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param value The value to be scaled.<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return The scaled value.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    protected double scale(double min, double max, double value) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      if (max &lt;= min || value &lt;= min) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        return 0;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if ((max - min) == 0) return 0;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  /**<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * Given the starting state of the regions and a potential ending state<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * compute cost based upon the number of regions that have moved.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   */<a name="line.886"></a>
-<span class="sourceLineNo">887</span>  static class MoveCostFunction extends CostFunction {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.896"></a>
+<span class="sourceLineNo">827</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // a zero sum cost for this to make sense.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // It's possible that there aren't enough regions to go around<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      double min;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      if (count &gt; total) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      } else {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        // Some will have 1 more than everything else.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        int numLow = (int) (count - numHigh);<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>      }<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      min = Math.max(0, min);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        double n = stats[i];<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        double diff = Math.abs(mean - n);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>        totalCost += diff;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>      double scaled =  scale(min, max, totalCost);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return scaled;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
+<span class="sourceLineNo">853</span><a name="line.853"></a>
+<span class="sourceLineNo">854</span>    private double getSum(double[] stats) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      double total = 0;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      for(double s:stats) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        total += s;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      }<a name="line.858"></a>
+<span class="sourceLineNo">859</span>      return total;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
+<span class="sourceLineNo">861</span><a name="line.861"></a>
+<span class="sourceLineNo">862</span>    /**<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * Scale the value between 0 and 1.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>     * @param min   Min value<a name="line.865"></a>
+<span class="sourceLineNo">866</span>     * @param max   The Max value<a name="line.866"></a>
+<span class="sourceLineNo">867</span>     * @param value The value to be scaled.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>     * @return The scaled value.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>     */<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    protected double scale(double min, double max, double value) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      if (max &lt;= min || value &lt;= min) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        return 0;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      if ((max - min) == 0) return 0;<a name="line.874"></a>
+<span class="sourceLineNo">875</span><a name="line.875"></a>
+<span class="sourceLineNo">876</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Given the starting state of the regions and a potential ending state<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * compute cost based upon the number of regions that have moved.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  static class MoveCostFunction extends CostFunction {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    private static final String MOVE_COST_OFFPEAK_KEY =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      "hbase.master.balancer.stochastic.moveCost.offpeak";<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.888"></a>
+<span class="sourceLineNo">889</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    static final float DEFAULT_MOVE_COST = 7;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    static final float DEFAULT_MOVE_COST_OFFPEAK = 3;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>    private final float maxMovesPercent;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    private final Configuration conf;<a name="line.896"></a>
 <span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>    private final float maxMovesPercent;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    private final Configuration conf;<a name="line.899"></a>
-<span class="sourceLineNo">900</span><a name="line.900"></a>
-<span class="sourceLineNo">901</span>    MoveCostFunction(Configuration conf) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      super(conf);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.conf = conf;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected double cost() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      // that large benefits are need to overcome the cost of a move.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      } else {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          DEFAULT_MAX_MOVES);<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>      double moveCost = cluster.numMovedRegions;<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>      // Don't let this single balance move more than the max moves.<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (moveCost &gt; maxMoves) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>  }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>  /**<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * regions on a cluster.<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   */<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    private double[] stats = null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      super(conf);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    void init(Cluster cluster) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      super.init(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.957"></a>
-<span class="sourceLineNo">958</span>          cluster.numServers, cluster.numRegions);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      if (LOG.isTraceEnabled()) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.961"></a>
-<span class="sourceLineNo">962</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    @Override<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    protected double cost() {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        stats = new double[cluster.numServers];<a name="line.970"></a>
+<span class="sourceLineNo">898</span>    MoveCostFunction(Configuration conf) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      super(conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      this.conf = conf;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>      // Initialize the multiplier so that addCostFunction will add this cost function.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      // It may change during later evaluations, due to OffPeakHours.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>    @Override<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected double cost() {<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      // that large benefits are need to overcome the cost of a move.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      if (OffPeakHours.getInstance(conf).isOffPeakHour()) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>        this.setMultiplier(conf.getFloat(MOVE_COST_OFFPEAK_KEY, DEFAULT_MOVE_COST_OFFPEAK));<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      } else {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.919"></a>
+<span class="sourceLineNo">920</span>          DEFAULT_MAX_MOVES);<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      double moveCost = cluster.numMovedRegions;<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>      // Don't let this single balance move more than the max moves.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (moveCost &gt; maxMoves) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        return 1000000;   // return a number much greater than any of the other cost<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    }<a name="line.931"></a>
+<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>  /**<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   * regions on a cluster.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>    private double[] stats = null;<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      super(conf);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    @Override<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    void init(Cluster cluster) {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      super.init(cluster);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.debug("{} sees a total of {} servers and {} regions.", getClass().getSimpleName(),<a name="line.954"></a>
+<span class="sourceLineNo">955</span>          cluster.numServers, cluster.numRegions);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      if (LOG.isTraceEnabled()) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>        for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          LOG.trace("{} sees server '{}' has {} regions", getClass().getSimpleName(),<a name="line.958"></a>
+<span class="sourceLineNo">959</span>              cluster.servers[i], cluster.regionsPerServer[i].length);<a name="line.959"></a>
+<span class="sourceLineNo">960</span>        }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected double cost() {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>        stats = new double[cluster.numServers];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.970"></a>
 <span class="sourceLineNo">971</span>      }<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return costFromArray(stats);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  /**<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * primary regions on a cluster.<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   */<a name="line.982"></a>
-<span class="sourceLineNo">983</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private double[] stats = null;<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      super(conf);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    boolean isNeeded() {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      return cluster.hasRegionReplicas;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    @Override<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    protected double cost() {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      if (!cluster.hasRegionReplicas) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 0;<a name="line.1005"></a>
+<span class="sourceLineNo">972</span>      return costFromArray(stats);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>  }<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>  /**<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * primary regions on a cluster.<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private double[] stats = null;<a name="line.985"></a>
+<span class="sourceLineNo">986</span><a name="line.986"></a>
+<span class="sourceLineNo">987</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      super(conf);<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
+<span class="sourceLineNo">993</span><a name="line.993"></a>
+<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    boolean isNeeded() {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      return cluster.hasRegionReplicas;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
+<span class="sourceLineNo">998</span><a name="line.998"></a>
+<span class="sourceLineNo">999</span>    @Override<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    protected double cost() {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (!cluster.hasRegionReplicas) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        return 0;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        stats = new double[cluster.numServers];<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        stats = new double[cluster.numServers];<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        stats[i] = 0;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            stats[i]++;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      return costFromArray(stats);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * distributed tables are.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span><a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      super(conf);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    @Override<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    protected double cost() {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double max = cluster.numRegions;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      double value = 0;<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span><a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      return scale(min, max, value);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  /**<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   */<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    private final LocalityType type;<a name="line.1059"></a>
+<span class="sourceLineNo">1007</span><a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>        stats[i] = 0;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>            stats[i]++;<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          }<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      return costFromArray(stats);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>  }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span><a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  /**<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   * distributed tables are.<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>   */<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span><a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      super(conf);<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    protected double cost() {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>      double max = cluster.numRegions;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      double value = 0;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        value += cluster.numMaxRegionsPerTable[i];<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      return scale(min, max, value);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>  }<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span><a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>  /**<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private final LocalityType type;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1059"></a>
 <span class="sourceLineNo">1060</span><a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      float defaultLocalityCost) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      super(conf);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      this.type = type;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      this.locality = 0.0;<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      this.bestLocality = 0.0;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>     */<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    @Override<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    void init(Cluster cluster) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      super.init(cluster);<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      locality = 0.0;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      bestLocality = 0.0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      // (and the cost is 0)<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    @Override<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      locality += normalizedDelta;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    protected double cost() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1 - locality;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span><a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1119"></a>
+<span class="sourceLineNo">1061</span>    LocalityBasedCostFunction(Configuration conf, LocalityType type, String localityCostKey,<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>      float defaultLocalityCost) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      super(conf);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.type = type;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.locality = 0.0;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.bestLocality = 0.0;<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span><a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    /**<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>     */<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    @Override<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    void init(Cluster cluster) {<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      super.init(cluster);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      locality = 0.0;<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      bestLocality = 0.0;<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span><a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      // (and the cost is 0)<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>    @Override<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      locality += normalizedDelta;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span><a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    @Override<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    protected double cost() {<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      return 1 - locality;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span><a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  }<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span><a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span><a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1119"></a>
 <span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span><a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    @Override<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    int regionIndexToEntityIndex(int region) {<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1134"></a>
+<span class="sourceLineNo">1121</span>    ServerLocalityCostFunction(Configuration conf) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      super(conf, LocalityType.SERVER, LOCALITY_COST_KEY, DEFAULT_LOCALITY_COST);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    @Override<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    int regionIndexToEntityIndex(int region) {<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      return cluster.regionIndexToServerIndex[region];<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span><a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1134"></a>
 <span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    @Override<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    int regionIndexToEntityIndex(int region) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      return cluster.getRackForRegion(region);<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  }<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span><a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>  /**<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * number from RegionLoad.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span><a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    private ClusterMetrics clusterStatus = null;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    private double[] stats = null;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>      super(conf);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      this.clusterStatus = status;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>    }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      this.loads = l;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    @Override<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    protected double cost() {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      if (clusterStatus == null || loads == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        return 0;<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span><a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>        stats = new double[cluster.numServers];<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span><a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        //Cost this server has from RegionLoad<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>        long cost = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span><a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>        // for every region on this server get the rl<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          if (regionLoadList != null) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>          }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span><a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        // Add the total cost to the stats.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        stats[i] = cost;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>      }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      return costFromArray(stats);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span><a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      double cost = 0;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        cost += getCostFromRl(rl);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      return cost / regionLoadList.size();<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
+<span class="sourceLineNo">1136</span>    public RackLocalityCostFunction(Configuration conf) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      super(conf, LocalityType.RACK, RACK_LOCALITY_COST_KEY, DEFAULT_RACK_LOCALITY_COST);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    @Override<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    int regionIndexToEntityIndex(int region) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      return cluster.getRackForRegion(region);<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>  /**<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * number from RegionLoad.<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private ClusterMetrics clusterStatus = null;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    private double[] stats = null;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      super(conf);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    }<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>      this.clusterStatus = status;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      this.loads = l;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    @Override<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    protected double cost() {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      if (clusterStatus == null || loads == null) {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>        return 0;<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>      }<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span><a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        stats = new double[cluster.numServers];<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        //Cost this server has from RegionLoad<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>        long cost = 0;<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span><a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>        // for every region on this server get the rl<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span><a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>          if (regionLoadList != null) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>          }<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        // Add the total cost to the stats.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        stats[i] = cost;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>      }<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span><a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>      return costFromArray(stats);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span><a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>      double cost = 0;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        cost += getCostFromRl(rl);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      }<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return cost / regionLoadList.size();<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
 <span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   * to the rest of the regions.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   */<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    @Override<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      double cost = 0;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double previous = 0;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      boolean isFirst = true;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>        double current = getCostFromRl(rl);<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        if (isFirst) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          isFirst = false;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        } else {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cost += current - previous;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        previous = current;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>  }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  /**<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>   */<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span><a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      super(conf);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    @Override<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return rl.getReadRequestsCount();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  /**<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>   */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span><a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super(conf);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      return rl.getCpRequestsCount();<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  /**<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      super(conf);<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>    }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span><a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    @Override<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      return rl.getWriteRequestsCount();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>  }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span><a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  /**<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   * replica open.<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    long maxCost = 0;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span><a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      super(conf);<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    @Override<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    void init(Cluster cluster) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      super.init(cluster);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      }<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    }<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span><a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    long getMaxCost(Cluster cluster) {<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (!cluster.hasRegionReplicas) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        return 0; // short circuit<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      }<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>          cluster.regions.length);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span><a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      Arrays.sort(primariesOfRegions);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      // compute numReplicas from the sorted array<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      return costPerGroup(primariesOfRegions);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    }<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span><a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    @Override<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    boolean isNeeded() {<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>      return cluster.hasRegionReplicas;<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span><a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    protected double cost() {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>      if (maxCost &lt;= 0) {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        return 0;<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      }<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      long totalCost = 0;<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>        totalCost += costsPerGroup[i];<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      }<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      return scale(0, maxCost, totalCost);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span><a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    /**<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>     */<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>      long cost = 0;<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      int currentPrimary = -1;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      int currentPrimaryIndex = -1;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>          // square the cost<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>          }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>          currentPrimary = primary;<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>          currentPrimaryIndex = j;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>        }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
+<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>   * to the rest of the regions.<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>   */<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span><a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      super(conf);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    @Override<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      double cost = 0;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      double previous = 0;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>      boolean isFirst = true;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>        double current = getCostFromRl(rl);<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        if (isFirst) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>          isFirst = false;<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        } else {<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>          cost += current - previous;<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>        }<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>        previous = current;<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      return Math.max(0, cost / (regionLoadList.size() - 1));<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span><a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   * Compute the cost of total number of read requests  The more unbalanced the higher the<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span><a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  static class ReadRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span><a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    private static final String READ_REQUEST_COST_KEY =<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        "hbase.master.balancer.stochastic.readRequestCost";<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>    private static final float DEFAULT_READ_REQUEST_COST = 5;<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span><a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    ReadRequestCostFunction(Configuration conf) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      super(conf);<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      this.setMultiplier(conf.getFloat(READ_REQUEST_COST_KEY, DEFAULT_READ_REQUEST_COST));<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span><a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    @Override<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      return rl.getReadRequestsCount();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  /**<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   * Compute the cost of total number of coprocessor requests  The more unbalanced the higher the<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   */<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span><a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>  static class CPRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    private static final String CP_REQUEST_COST_KEY =<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>        "hbase.master.balancer.stochastic.cpRequestCost";<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    private static final float DEFAULT_CP_REQUEST_COST = 5;<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span><a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    CPRequestCostFunction(Configuration conf) {<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      super(conf);<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      this.setMultiplier(conf.getFloat(CP_REQUEST_COST_KEY, DEFAULT_CP_REQUEST_COST));<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    @Override<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      return rl.getCpRequestsCount();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span><a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>  /**<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   * Compute the cost of total number of write requests.  The more unbalanced the higher the<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>  static class WriteRequestCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span><a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    private static final String WRITE_REQUEST_COST_KEY =<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>        "hbase.master.balancer.stochastic.writeRequestCost";<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    private static final float DEFAULT_WRITE_REQUEST_COST = 5;<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span><a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    WriteRequestCostFunction(Configuration conf) {<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      super(conf);<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      this.setMultiplier(conf.getFloat(WRITE_REQUEST_COST_KEY, DEFAULT_WRITE_REQUEST_COST));<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    @Override<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return rl.getWriteRequestsCount();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>  }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span><a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  /**<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>   * A cost function for region replicas. We give a very high cost to hosting<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   * replicas of the same region in the same host. We do not prevent the case<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * though, since if numReplicas &gt; numRegionServers, we still want to keep the<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   * replica open.<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   */<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  static class RegionReplicaHostCostFunction extends CostFunction {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    private static final String REGION_REPLICA_HOST_COST_KEY =<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>        "hbase.master.balancer.stochastic.regionReplicaHostCostKey";<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    private static final float DEFAULT_REGION_REPLICA_HOST_COST_KEY = 100000;<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span><a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    long maxCost = 0;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    long[] costsPerGroup; // group is either server, host or rack<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    int[][] primariesOfRegionsPerGroup;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    public RegionReplicaHostCostFunction(Configuration conf) {<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      super(conf);<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_HOST_COST_KEY,<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>        DEFAULT_REGION_REPLICA_HOST_COST_KEY));<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    }<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span><a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    @Override<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    void init(Cluster cluster) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>      super.init(cluster);<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      maxCost = cluster.numHosts &gt; 1 ? getMaxCost(cluster) : 0;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      costsPerGroup = new long[cluster.numHosts];<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      primariesOfRegionsPerGroup = cluster.multiServersPerHost // either server based or host based<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          ? cluster.primariesOfRegionsPerHost<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>          : cluster.primariesOfRegionsPerServer;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      for (int i = 0 ; i &lt; primariesOfRegionsPerGroup.length; i++) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        costsPerGroup[i] = costPerGroup(primariesOfRegionsPerGroup[i]);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    long getMaxCost(Cluster cluster) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      if (!cluster.hasRegionReplicas) {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        return 0; // short circuit<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      // max cost is the case where every region replica is hosted together regardless of host<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      int[] primariesOfRegions = new int[cluster.numRegions];<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      System.arraycopy(cluster.regionIndexToPrimaryIndex, 0, primariesOfRegions, 0,<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>          cluster.regions.length);<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span><a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>      Arrays.sort(primariesOfRegions);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      // compute numReplicas from the sorted array<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      return costPerGroup(primariesOfRegions);<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    @Override<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    boolean isNeeded() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      return cluster.hasRegionReplicas;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span><a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    protected double cost() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>      if (maxCost &lt;= 0) {<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>        return 0;<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      }<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>      long totalCost = 0;<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      for (int i = 0 ; i &lt; costsPerGroup.length; i++) {<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>        totalCost += costsPerGroup[i];<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      }<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      return scale(0, maxCost, totalCost);<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span><a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    /**<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>     * For each primary region, it computes the total number of replicas in the array (numReplicas)<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>     * and returns a sum of numReplicas-1 squared. For example, if the server hosts<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>     * regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>     * returns (2-1) * (2-1) + (3-1) * (3-1) + (1-1) * (1-1).<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>     * @param primariesOfRegions a sorted array of primary regions ids for the regions hosted<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>     * @return a sum of numReplicas-1 squared for each primary region in the group.<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>     */<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    protected long costPerGroup(int[] primariesOfRegions) {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      long cost = 0;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      int currentPrimary = -1;<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      int currentPrimaryIndex = -1;<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      // primariesOfRegions is a sorted array of primary ids of regions. Replicas of regions<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      // sharing the same primary will have consecutive numbers in the array.<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (int j = 0 ; j &lt;= primariesOfRegions.length; j++) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>        int primary = j &lt; primariesOfRegions.length ? primariesOfRegions[j] : -1;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        if (primary != currentPrimary) { // we see a new primary<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          // square the cost<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            cost += (numReplicas - 1) * (numReplicas - 1);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          currentPrimary = primary;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>          currentPrimaryIndex = j;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>      return cost;<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    }<a name="line.1400"></a>
 <span class="sourceLineNo">1401</span><a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      return cost;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    }<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span><a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    @Override<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      if (maxCost &lt;= 0) {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        return; // no need to compute<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      }<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      if (cluster.multiServersPerHost) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (newHost != oldHost) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>        }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      } else {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>  }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  /**<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>   * though.<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>   */<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span><a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      super(conf);<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    void init(Cluster cluster) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      this.cluster = cluster;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>        maxCost = 0;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        return; // disabled for 1 rack<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      maxCost = getMaxCost(cluster);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span><a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      if (maxCost &lt;= 0) {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>        return; // no need to compute<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>      if (newRack != oldRack) {<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>      }<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>  }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span><a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  /**<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>   */<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span><a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span><a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      super(conf);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    @Override<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      return rl.getMemStoreSizeMB();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>    }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  }<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  /**<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>   */<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span><a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      super(conf);<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      return rl.getStorefileSizeMB();<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>  }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span><a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>  /**<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>   */<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>  }<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>}<a name="line.1517"></a>
+<span class="sourceLineNo">1402</span>    @Override<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      if (maxCost &lt;= 0) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        return; // no need to compute<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>      }<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      if (cluster.multiServersPerHost) {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        int oldHost = cluster.serverIndexToHostIndex[oldServer];<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        int newHost = cluster.serverIndexToHostIndex[newServer];<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>        if (newHost != oldHost) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>          costsPerGroup[oldHost] = costPerGroup(cluster.primariesOfRegionsPerHost[oldHost]);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>          costsPerGroup[newHost] = costPerGroup(cluster.primariesOfRegionsPerHost[newHost]);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      } else {<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>        costsPerGroup[oldServer] = costPerGroup(cluster.primariesOfRegionsPerServer[oldServer]);<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>        costsPerGroup[newServer] = costPerGroup(cluster.primariesOfRegionsPerServer[newServer]);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>      }<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * A cost function for region replicas for the rack distribution. We give a relatively high<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * cost to hosting replicas of the same region in the same rack. We do not prevent the case<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * though.<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   */<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>  static class RegionReplicaRackCostFunction extends RegionReplicaHostCostFunction {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    private static final String REGION_REPLICA_RACK_COST_KEY =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        "hbase.master.balancer.stochastic.regionReplicaRackCostKey";<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    private static final float DEFAULT_REGION_REPLICA_RACK_COST_KEY = 10000;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span><a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    public RegionReplicaRackCostFunction(Configuration conf) {<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>      super(conf);<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      this.setMultiplier(conf.getFloat(REGION_REPLICA_RACK_COST_KEY,<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>        DEFAULT_REGION_REPLICA_RACK_COST_KEY));<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    void init(Cluster cluster) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>      this.cluster = cluster;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      if (cluster.numRacks &lt;= 1) {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        maxCost = 0;<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        return; // disabled for 1 rack<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      // max cost is the case where every region replica is hosted together regardless of rack<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      maxCost = getMaxCost(cluster);<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      costsPerGroup = new long[cluster.numRacks];<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      for (int i = 0 ; i &lt; cluster.primariesOfRegionsPerRack.length; i++) {<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>        costsPerGroup[i] = costPerGroup(cluster.primariesOfRegionsPerRack[i]);<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span><a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>    @Override<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      if (maxCost &lt;= 0) {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        return; // no need to compute<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>      }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      int oldRack = cluster.serverIndexToRackIndex[oldServer];<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      int newRack = cluster.serverIndexToRackIndex[newServer];<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      if (newRack != oldRack) {<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        costsPerGroup[oldRack] = costPerGroup(cluster.primariesOfRegionsPerRack[oldRack]);<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>        costsPerGroup[newRack] = costPerGroup(cluster.primariesOfRegionsPerRack[newRack]);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      }<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>  }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  /**<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>   * Compute the cost of total memstore size.  The more unbalanced the higher the<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>   */<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>  static class MemStoreSizeCostFunction extends CostFromRegionLoadAsRateFunction {<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span><a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    private static final String MEMSTORE_SIZE_COST_KEY =<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>        "hbase.master.balancer.stochastic.memstoreSizeCost";<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    private static final float DEFAULT_MEMSTORE_SIZE_COST = 5;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span><a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    MemStoreSizeCostFunction(Configuration conf) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      super(conf);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      this.setMultiplier(conf.getFloat(MEMSTORE_SIZE_COST_KEY, DEFAULT_MEMSTORE_SIZE_COST));<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span><a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    @Override<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      return rl.getMemStoreSizeMB();<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>  /**<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   * Compute the cost of total open storefiles size.  The more unbalanced the higher the<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   * computed cost will be.  This uses a rolling average of regionload.<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>   */<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>  static class StoreFileCostFunction extends CostFromRegionLoadFunction {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    private static final String STOREFILE_SIZE_COST_KEY =<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        "hbase.master.balancer.stochastic.storefileSizeCost";<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    private static final float DEFAULT_STOREFILE_SIZE_COST = 5;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    StoreFileCostFunction(Configuration conf) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      super(conf);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      this.setMultiplier(conf.getFloat(STOREFILE_SIZE_COST_KEY, DEFAULT_STOREFILE_SIZE_COST));<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span><a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    @Override<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>    protected double getCostFromRl(BalancerRegionLoad rl) {<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>      return rl.getStorefileSizeMB();<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>    }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span><a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>  /**<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   * A helper function to compose the attribute name from tablename and costfunction name<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   */<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>  public static String composeAttributeName(String tableName, String costFunctionName) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    return tableName + TABLE_FUNCTION_SEP + costFunctionName;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>  }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>}<a name="line.1514"></a>
 
 
 
diff --git a/downloads.html b/downloads.html
index 7367f8b..fbedb9a 100644
--- a/downloads.html
+++ b/downloads.html
@@ -462,7 +462,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/export_control.html b/export_control.html
index 1604431..8be0e39 100644
--- a/export_control.html
+++ b/export_control.html
@@ -197,7 +197,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/index.html b/index.html
index d91777c..64be4d0 100644
--- a/index.html
+++ b/index.html
@@ -275,7 +275,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/issue-tracking.html b/issue-tracking.html
index c8e1353..4576f28 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -169,7 +169,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/mail-lists.html b/mail-lists.html
index 537e09a..ce73a55 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -215,7 +215,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/metrics.html b/metrics.html
index 33d2248..27efe51 100644
--- a/metrics.html
+++ b/metrics.html
@@ -325,7 +325,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/old_news.html b/old_news.html
index b84b7a7..4e0d10a 100644
--- a/old_news.html
+++ b/old_news.html
@@ -316,7 +316,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/plugin-management.html b/plugin-management.html
index d5a35de..84a02cd 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -321,7 +321,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/plugins.html b/plugins.html
index d3584a1..5c4e303 100644
--- a/plugins.html
+++ b/plugins.html
@@ -248,7 +248,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index cb30825..ad7a6e1 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -650,7 +650,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-info.html b/project-info.html
index 20902d0..a623da7 100644
--- a/project-info.html
+++ b/project-info.html
@@ -210,7 +210,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-reports.html b/project-reports.html
index d1f8ba4..594a7d0 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -186,7 +186,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-summary.html b/project-summary.html
index ca71b59..ce91f53 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -212,7 +212,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 02bad80..24c17a8 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -174,7 +174,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/replication.html b/replication.html
index 445dd03..c947c72 100644
--- a/replication.html
+++ b/replication.html
@@ -169,7 +169,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/resources.html b/resources.html
index e3511df..ebafed2 100644
--- a/resources.html
+++ b/resources.html
@@ -197,7 +197,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/source-repository.html b/source-repository.html
index 619049c..e08da1f 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -180,7 +180,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/sponsors.html b/sponsors.html
index 62469f5..c705a41 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -199,7 +199,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/supportingprojects.html b/supportingprojects.html
index d387a68..111e0ba 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -390,7 +390,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/team-list.html b/team-list.html
index 5ee70c4..50de235 100644
--- a/team-list.html
+++ b/team-list.html
@@ -725,7 +725,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-04-13</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.FairRandomCandidateGenerator.html b/testdevapidocs/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.FairRandomCandidateGenerator.html
index 8ab43ba..e74f081 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.FairRandomCandidateGenerator.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.FairRandomCandidateGenerator.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -162,36 +162,32 @@
          int&nbsp;arg3)</code>&nbsp;</td>
 </tr>
 <tr id="i2" class="altColor">
-<td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.FairRandomCandidateGenerator.html#getRandomIterationOrder-int-">getRandomIterationOrder</a></span>(int&nbsp;arg0)</code>&nbsp;</td>
-</tr>
-<tr id="i3" class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.FairRandomCandidateGenerator.html#pickOtherRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomRack</a></span>(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster&nbsp;arg0,
                    int&nbsp;arg1)</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.FairRandomCandidateGenerator.html#pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">pickOtherRandomServer</a></span>(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster&nbsp;arg0,
                      int&nbsp;arg1)</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.FairRandomCandidateGenerator.html#pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomRack</a></span>(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster&nbsp;arg0)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.FairRandomCandidateGenerator.html#pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">pickRandomRegion</a></span>(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster&nbsp;arg0,
                 int&nbsp;arg1,
                 double&nbsp;arg2)</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.FairRandomCandidateGenerator.html#pickRandomRegions-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-int-">pickRandomRegions</a></span>(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster&nbsp;cluster,
                  int&nbsp;thisServer,
                  int&nbsp;otherServer)</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.FairRandomCandidateGenerator.html#pickRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">pickRandomServer</a></span>(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster&nbsp;arg0)</code>&nbsp;</td>
 </tr>
@@ -306,7 +302,7 @@
 <a name="getAction-int-int-int-int-">
 <!--   -->
 </a>
-<ul class="blockList">
+<ul class="blockListLast">
 <li class="blockList">
 <h4>getAction</h4>
 <pre>protected&nbsp;org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.0">getAction</a>(int&nbsp;arg0,
@@ -315,15 +311,6 @@
                                                                                             int&nbsp;arg3)</pre>
 </li>
 </ul>
-<a name="getRandomIterationOrder-int-">
-<!--   -->
-</a>
-<ul class="blockListLast">
-<li class="blockList">
-<h4>getRandomIterationOrder</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/CandidateGenerator.html#line.0">getRandomIterationOrder</a>(int&nbsp;arg0)</pre>
-</li>
-</ul>
 </li>
 </ul>
 </li>